Swift:对成员“地图”的含糊不清的引用

时间:2018-09-01 17:47:42

标签: swift

我正在阅读“快速编程语言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”成员? 您能为我提供此错误的说明和正确的解决方案吗? 谢谢!

2 个答案:

答案 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