考虑下面给出的代码
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
。
当我删除no1
和no2
两个级别时,会出现以下错误:
error: missing argument label 'no2:' in call
counter.incrementBy(1800, 3)
^
no2:
任何人都可以解释这种行为。提前谢谢。
答案 0 :(得分:10)
这个答案的内容(为Swift 2.2 bbelow编写)大部分内容仍然适用,但区别在于现在Swift 3中存在以下默认行为:
即,第一个函数参数不再具有空的(省略的,_
)外部参数名称,默认情况下,就像Swift 2.2中的情况一样。
有关其他详细信息,请参阅以下已接受和实施的Swift Evolution提案:
对于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:
对函数的调用。