当我在学习' function '时,我遇到了一个问题,在call ';中显示'多余的参数标签'number:'我的代码的错误信息。我想知道为什么我不应该写上"数字"。在论点吗?
func makeIncrementer() -> ((Int) -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(number: 7)
输入图片描述
问题是您返回的是(Int) -> Int
,它没有为其参数指定名称。理想情况下,您希望写入
func makeIncrementer() -> ((number: Int) -> Int)
但是在Swift中是不允许的:
function types cannot have argument labels; use '_' before 'number'
你能做的最好的就是
func makeIncrementer() -> ((_ number: Int) -> Int)
这个策略可能会让你的代码更清晰一些,因为给参数一个名字会让它的目的更明显。不幸的是,在调用返回的函数
时仍然必须省略number:
标签:let increment = makeIncrementer()
increment(7) // <- no `number:` label
理由是什么?
在Swift 3之前可以为函数类型指定参数标签。问题是你可以写
func add(numToAdd: Int) -> Int { ... }
func subtract(numToSubtract: Int) -> Int { ... }
let f: ((numToAdd: Int) -> Int) = subtract
然后调用f(numToAdd: 3)
实际上会调用subtract(numToSubtract: 3)
,这是相当令人惊讶的,并且会引起混淆。
查看此提案以了解删除此功能的完整理由。