错误:调用中无关的参数标签'no1:'

Jay*_*mar 3 swift

考虑下面给出的代码

class division {
    var count: Int = 0
    func incrementBy(no1: Int, no2: Int) {
        count = no1 / no2
        println(count)
    }
}

let counter = division()
counter.incrementBy(no1:1800, no2: 3)
Run Code Online (Sandbox Code Playgroud)

它给出以下错误:

error: extraneous argument label 'no1:' in call
counter.incrementBy(no1:1800, no2: 3)
                   ^~~~~
Run Code Online (Sandbox Code Playgroud)

当我删除标签时no1,编译器不会抱怨标签no2.

当我删除这两个水平no1no2,它提供了以下错误:

error: missing argument label 'no2:' in call
counter.incrementBy(1800,  3)
                   ^
                           no2: 
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这种行为.提前致谢.

dfr*_*fri 10

斯威夫特3

这个答案的内容(为Swift 2.2 bbelow编写)大部分仍然适用,但区别在于Swift 3中现在存在以下默认行为:

  • 除非另有说明,否则所有函数参数都具有与内部参数相同的外部参数名称.

即,第一个函数参数不再具有空(省略_)外部参数名称,默认情况下,就像Swift 2.2中的情况一样.

有关其他详细信息,请参阅以下接受并实施的Swift Evolution提案:


斯威夫特2

功能:外部和内部参数名称

对于Swift中的任何函数,函数参数具有内部参数名称和外部参数名称.默认情况下,以下默认行为成立:

  • 第一个函数参数具有空(省略_)外部参数名称.
  • 除非另有说明,否则以下所有参数都具有与内部参数相同的外部参数名称.

因此,遵循功能

func foo(first: Int, second: Int) {}
Run Code Online (Sandbox Code Playgroud)

被称为

foo(1, second: 2)
//  |     \
//  |   by default, same external as internal parameter name
//   \
//    by default, no external parameter name  
Run Code Online (Sandbox Code Playgroud)

现在,您可以自然地指定第一个函数参数是否应该具有外部名称(然后在调用函数时需要指定):

func foo(firstExternal first: Int, second: Int) {}

// called as
foo(firstExternal: 1, second: 2)
Run Code Online (Sandbox Code Playgroud)

同样,您可以通过将外部名称指定为下划线来指定您希望第二个参数没有外部名称(省略)_.

func foo(first: Int, _ second: Int) {}

// called as
foo(1, 2)
Run Code Online (Sandbox Code Playgroud)

如果我们回到上面的第一个例子(默认行为),我们意识到如果我们没有指定外部名称,例如

func foo(first: Int, second: Int) {}
Run Code Online (Sandbox Code Playgroud)

我们得到一个"默认"函数签名(wrt外部参数名称),它是以下明确声明的外部名称的等价物:

func foo(_ first: Int, second second: Int) {}
//       |               \
//       |       same external as internal parameter name
//        \
//    no (omitted) external parameter name
Run Code Online (Sandbox Code Playgroud)

有关其他详细信息,请参阅

你的具体例子

使用上面的知识,我们可以将它应用于您的特定示例,仅查看您的函数的签名incrementBy:

func incrementBy(no1: Int, no2: Int) { ... }
//               |          \
//               |    no explicitly stated external names: hence, since
//               |    this is not the first parameter, the external name
//               |    is set to the same as the internal name (no2), by default
//                \
//       no explicitly stated external names: hence, since this is the
//       first parameter, the external name is omitted, by default  
Run Code Online (Sandbox Code Playgroud)

因此,我们将您的功能incrementBy称为

incrementBy(1, no2: 2)
Run Code Online (Sandbox Code Playgroud)

有了这个,我们也意识到为什么你自己的两次尝试 - 包含在你的问题中 - 会产生错误:

错误#1

error: extraneous argument label 'no1:' in call
counter.incrementBy(no1:1800, no2: 3)
Run Code Online (Sandbox Code Playgroud)

正如此错误消息所解释的那样,第一个函数参数有一个无关的参数标签:如上所述,第一个函数参数默认具有省略的外部参数名称(在您的示例中有效),因此,在调用时它,我们应该不包括第一个参数的参数标签.

错误#2

error: missing argument label 'no2:' in call
counter.incrementBy(1800,  3)
Run Code Online (Sandbox Code Playgroud)

另一方面,此尝试调用正确地省略了第一个参数的外部参数名称标签,但对第二个参数也是如此.incrementBy但是,第二个函数参数具有与其内部参数名称相同的外部参数名称,因此,外部参数名称标签no2:必须包含在对函数的调用中.