Swift:对成员 'map' 的引用不明确

标签 swift

我正在阅读“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
}

这里的类型是 myClosurereturnType 。它设置在两个地方::之后,以及 -> 之后。您可以通过删除 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/

相关文章:

ios - 按钮的圆角半径与下面的 View 对齐

ios - 扩展中的延迟加载属性(Swift)

swift - flutter 将 Objective C 项目迁移到 Swift 项目。使用swift插件时出错

ios - 如何将后退图标添加到左侧栏按钮?

ios - 如何手动添加在文本字段内单击时消失的 UITextField 占位符文本?

ios - TableView 操作不显示

ios - 弹出图片库无法在 iPad iOS Swift 中工作

ios - 像在 TableView 行上一样,在节标题上分开 segue

ios - 在 Xcode 10 中构建时重置应用程序后 String.hashValue 不是唯一的

ios - Swift 2.0/UITableViewCell - 滚动时无法在顶部位置的单元格中发生操作