Swift:对成员'map'的模糊引用



我正在阅读"The swift programming language 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"成员? 你能给我解释这个错误和正确的解决方案吗? 谢谢!

通过使用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

不是注释参数类型,而是必须指定闭包的返回类型

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 }

最新更新