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

时间:2016-04-05 09:02:30

标签: 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)

它出现以下错误:

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

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

当我删除no1no2两个级别时,会出现以下错误:

error: missing argument label 'no2:' in call
counter.incrementBy(1800,  3)
                   ^
                           no2: 

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

1 个答案:

答案 0 :(得分:10)

Swift 3

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

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

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

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

Swift 2

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

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

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

因此,遵循功能

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

被称为

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

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

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

// called as
foo(firstExternal: 1, second: 2)

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

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

// called as
foo(1, 2)

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

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

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

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

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

您的具体示例

使用上面的知识,我们可以将它应用于您的特定示例,只查看您的函数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  

因此,我们将您的函数incrementBy称为

incrementBy(1, no2: 2)

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

  

错误#1

error: extraneous argument label 'no1:' in call
counter.incrementBy(no1:1800, no2: 3)
     

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

     

错误#2

error: missing argument label 'no2:' in call
counter.incrementBy(1800,  3)
     

另一方面,此尝试呼叫正确省略了外部呼叫   第一个参数的参数名称标签,但也适用于   第二个论点。 incrementBy的第二个函数参数,   但是,具有与其内部参数名称相同的外部参数名称   因此,必须包含外部参数名称标签no2:   对函数的调用。