我正在阅读“快速编程语言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

10-07 19:13
查看更多