Swift奇怪的行为 - 在函数调用和外部函数调用中

时间:2014-06-08 18:05:32

标签: swift

我试图在viewDidLoad中定义一个简单的函数,如下所示:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    // my method below
    func add(number1:Int, number2:Int)
    {
        println("sum \(number1 + number2)")
    }

    add(5, 7) // able to invoke simply by passing values
}

这里我只能通过传递两个整数值来调用add函数,但是当我尝试在viewDidLoad之外定义add方法时这样:

// my method defined outside viewDidLoad
func add(number1:Int, number2:Int)
{
    println("sum \(number1 + number2)")
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    add(5, number2: 7) // for second passed parameter I had to specify name of variable, since compiler was complaining
}

我无法通过传递两个值来调用它,我必须指定第二个变量的名称,因为编译器在抱怨。

有什么理由吗?

2 个答案:

答案 0 :(得分:1)

正如David指出的那样,用作方法的函数(与对象相关的函数,即)处理与" plain"不同的参数。函数启用ObjC样式的消息传递:

  

具体来说,Swift在方法中给出了第一个参数名称   默认情况下参数名称,并给出第二个和后续的   默认情况下,参数名称为本地和外部参数名称。   此约定与您的典型命名和调用约定相匹配   熟悉编写Objective-C方法,并为之做好准备   表达方法调用,无需限定参数   名。

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-XID_300

换句话说,Swift会将您的函数视为如果将其编写为如果将其定义为方法:

func add(number1:Int, #number2:Int)
{
    println("sum \(number1 + number2)")
}

添加"#"对于第一个示例中的第二个参数,调用在两种情况下都是相同的(函数和方法调用)。 "#"本身是一个与本地参数名称匹配的参数名称的简写,所以这也适用:

func add(number1:Int, number2 number2:Int)
{
    println("sum \(number1 + number2)")
}

这使得修复界面变得容易以更多句子风格的方式调用(同时切换到swift-guide样式括号放置):

func add(number1:Int, to number2:Int){
    println("sum \(number1 + number2)")
}

someInstance.add(2,to:3)

Swift 3的更新:

使用Swift 3.0,这将改变,并且在声明函数时必须使用所有参数。参见:

https://github.com/apple/swift-evolution/blob/master/proposals/0046-first-label.md

答案 1 :(得分:0)

swift以不同方式处理方法和函数的参数。使用方法(为了与Objective-C兼容,我怀疑)只省略了初始标记:其余部分是必需的。使用函数时,所有标记都被省略。