对成员'=='的快速模糊引用

时间:2016-10-15 23:17:31

标签: swift swift3

这是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"
    }
}

2 个答案:

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

我当然不应该这样做,但它有效。