我正在阅读“Swift 编程语言 4.2”。在开始的章节,第 23 页,我有以下要求:
Rewrite the closure to return zero for all odd number
我的解决方案是:
let myArray: [Int] = [1, 2, 3, 4, 5]
myArray.map({ (number: Int) in
if number % 2 != 0 {
return 0
} else {
return number
}
})
但是我有以下错误:
Ambiguous reference to member 'map'
我真的不明白为什么我错了,为什么我的'myArray'不能引用'map'成员? 您能给我解释这个错误以及正确的解决方案吗? 谢谢!
最佳答案
通过使用 as [Int]
指定返回类型来减少歧义:
myArray.map({ (number: Int) in
if number % 2 != 0 {
return 0
} else {
return number
}
}) as [Int]
或者:
let result: [Int] = myArray.map({ (number: Int) in
if number % 2 != 0 {
return 0
} else {
return number
}
})
print(result) //[0, 2, 0, 4, 0]
正如 vadian 所指出的:歧义来自于无法推断闭包中的通用返回类型这一事实。
要了解编译器如何推断闭包的返回类型,让我们回到闭包的语法:
let myClosure: returnType = { (params) -> returnType in
statements
}
这里的类型是 myClosure
是 returnType
。它设置在两个地方::
之后,以及 ->
之后。您可以通过删除 returnType
来使用类型推断。来自两个地方之一,但不是两个地方。
因此您可以将其从大括号内删除(如上面的代码所示):
let result: [Int] = myArray.map({ (number: Int) in
或者在变量名称之后,并在大括号内指定闭包的返回类型:
let result = myArray.map({ (number: Int) -> Int in
关于Swift:对成员 'map' 的引用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52166315/