我正在阅读“快速编程语言4.2”。在第23页的第一章中,我有以下要求:
重写闭包以对所有奇数返回零
我的解决方法是:
let myArray: [Int] = [1, 2, 3, 4, 5]
myArray.map({ (number: Int) in
if number % 2 != 0 {
return 0
} else {
return number
}
})
但是我有以下错误:
对成员“地图”的含糊不清
我真的不明白为什么我错了,为什么我的“ myArray”不能引用“ map”成员? 您能为我提供此错误的说明和正确的解决方案吗? 谢谢!
答案 0 :(得分:2)
不必注释参数类型,而必须指定闭包的返回类型
let myArray = [1, 2, 3, 4, 5] // You don't even need to annotate the array, the compiler knows the type.
let result = myArray.map({ number -> Int in
if number % 2 != 0 {
return 0
} else {
return number
}
})
或带有结尾的闭包语法和简写参数名称。在这种情况下,编译器可以推断一切
let result = myArray.map { $0 % 2 != 0 ? 0 : $0 }
答案 1 :(得分:1)
通过用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