这是Swift 3编译器中的错误吗?这不是含糊不清的,它是==
和两个String
。
它说:
error: ambiguous reference to member '=='
let strs = things.filter { return $0.id == "1" } .map { t in
^~
对于此示例代码:
class Thing {
var id: String = ""
}
let things = [Thing]()
let x = 1
let strs = things.filter { return $0.id == "1" } .map { t in
if x == 1 {
return "a"
}
else {
return "b"
}
}
答案 0 :(得分:8)
这是一个误导性的错误消息 - 实际上歧义在于你传递给map(_:)
的闭包表达式,因为Swift无法在没有任何外部上下文的情况下推断出多行闭包的返回类型
所以你可以使用三元条件运算符使闭包成一行:
let strs = things.filter { $0.id == "1"} .map { _ in
(x == 1) ? "a" : "b"
}
或者只是向编译器提供一些关于map(_:)
返回的显式类型信息:
let strs = things.filter { $0.id == "1"} .map { _ -> String in
的
let strs : [String] = things.filter { $0.id == "1"} .map { _ in
答案 1 :(得分:0)
我在尝试使用自己的过滤器功能时,<
运算符被标记为含糊不清的类似问题:
let shortNames = names.myFilter { (name) -> Bool in
return name.count < 4
}
与@Hamish的回答类似,我通过明确设置名称类型来修复此问题:
(name: String)
我当然不应该这样做,但它有效。