在什么情况下,我应该在swift中使用_作为参数

时间:2016-09-29 09:54:28

标签: swift uitextfield swift3 uitextfielddelegate

我是苹果Swift的新手。我正在尝试基于此tutorial构建一个演示应用。我发现该应用程序无法运行。经过几次试验并失败后,我发现如果我改变了代码行:

DB.beginTransaction
try{
     MyObject myObj = DB.readMyObject();
     myObj.setCurrentTime(System.currentTimeinMills());

     MyObject myObj1 = DB.readMyObject();
     myObj1.setCurrentTime(System.currentTimeinMills());

        // myObj Edited.
        // myObj1 Edited.

     if(isPermittedToSave()){
          DB.persist(myObj);
     }
     DB.persist(myObj1);

     DB.commitTransaction();
} Catch(Exception e) {
    DB.rollbackTransaction();
}

func textFieldDidEndEditing(textField: UITextField) {

我能够正确运行代码。

我想通过添加_作为其中一个参数来了解会发生什么。这两种方法都不会导致编译错误。但第一个确实给出了警告:

func textFieldDidEndEditing(_ textField: UITextField) {

由于第一个由apple教程给出,我不确定是否是一个错误。有人可以澄清我的怀疑吗?

3 个答案:

答案 0 :(得分:2)

我认为您使用的是Swift 3.0。您正在阅读的教程可能是Swift 2.2或Swift 2.3版本。它只不过是我所观察到的语法变化。我甚至在昨天更新到Xcode 8.0时遇到了这种情况

答案 1 :(得分:1)

来自Swift 3第一个参数标签也是初始化器的标准。

Swift 3 Evolution

  

第一个参数声明将匹配第二个和后面的参数的现有行为。无论位置如何,所有参数都将表现均匀。这将在整个Swift编程语言中创建一个简单,一致的参数声明方法,并使方法和函数声明与已经使用此标准的初始化器同步。

例如

UIScrollView

将声明contentOffset.y而非func foo(x: Int, y: Int)

现有的外部标签覆盖将继续适用于第一个参数。您在它支持的本地参数名称之前建立外部参数名称,用空格分隔。例如,

foo(x:y:)

详细了解SE-0046

中的第一个参数

答案 2 :(得分:0)

如果您想要多个没有外部名称的参数,则必须使用“_”下划线字符作为其外部名称: