将函数赋值给变量时,不允许使用Swift参数?

时间:2016-10-14 04:26:34

标签: swift arguments

Swift 3要求默认情况下所有参数标签都包含在函数调用中。然而,当一个函数被赋给一个变量(或常量),并且该变量通过参数时,不需要参数标签 - 甚至不允许。

例如,对于具有两个Int参数(int1int2)的函数,该函数分配给名为varName的变量:

varName (1, 5) // will work, but
varName (int1: 1, int2: 5) //produces an error for extraneous argument labels.
  1. 我的理解是否正确?

  2. 这里不要求参数标签的理由是什么? (我找不到任何关于此的文件。)

1 个答案:

答案 0 :(得分:1)

  1. 请参阅SE-0111 - Remove type system significance of function argument labels
  2. 示例:

    func foo(bar: Int, baz: String) {
        print(bar, baz)
    }
    
    foo(bar: 123, baz: "abc") // Valid, prints: 123 abc
    
    let x = foo //Inferred type: (Int, String) -> Void
    x(123, "abc") // Valid, prints: 123 abc
    
    let y: (bar: Int, baz: String) -> Void = foo // Invalid
        // ERROR at line 10, col 9: function types cannot have argument label 'bar'; use '_' instead
        // let y: (bar: Int, baz: String) -> Void
        //         ^
        //         _ 
        // ERROR at line 10, col 19: function types cannot have argument label 'baz'; use '_' instead
        // let y: (bar: Int, baz: String) -> Void
        //                   ^
        //                   _ 
    y(bar: 123, baz: "abc") // Invalid
        // ERROR at line 19, col 2: extraneous argument labels 'bar:baz:' in call
        // y(bar: 123, baz: "abc") // 123 abc
        //  ^~~~~~     ~~~~~