我刚刚发现Set类型的MKAnnotation不能按预期工作。

class MyAnnotation: MKPointAnnotation {
    let id: String

    init(_ id: String) {
        self.id = id
    }

    override var hash: Int {
        return id.hash
    }

    static func ==(lhs: MyAnnotation, rhs: MyAnnotation) -> Bool {
        return lhs.hashValue == rhs.hashValue
    }
}

let m1 = MyAnnotation("1")
let m2 = MyAnnotation("2")
let n1 = MyAnnotation("1")
let n2 = MyAnnotation("2")

m1.hashValue //918
n1.hashValue //918

m2.hashValue //921
n2.hashValue //921

if m1 == n1 && m2 == n2 {
    print(true)
}
// prints true

let s1 = Set(arrayLiteral: m1, m2)
let s2 = Set(arrayLiteral: n1, n2)

let i = s1.intersection(s2)
// empty

m和n的交集是空的,即使散列是相同的。请与下面的示例进行比较:
class MyAnnotation: Hashable, Equatable {
    let id: String

    init(_ id: String) {
        self.id = id
    }

    var hashValue: Int {
        return id.hash
   }

    static func ==(lhs: MyAnnotation, rhs: MyAnnotation) -> Bool {
        return lhs.hashValue == rhs.hashValue
    }
}

let m1 = MyAnnotation("1")
let m2 = MyAnnotation("2")
let n1 = MyAnnotation("1")
let n2 = MyAnnotation("2")

m1.hashValue //918
n1.hashValue //918

m2.hashValue //921
n2.hashValue //921

if m1 == n1 && m2 == n2 {
    print(true)
}
// prints true

let s1 = Set(arrayLiteral: m1, m2)
let s2 = Set(arrayLiteral: n1, n2)

let i = s1.intersection(s2)
// {{id "1"}, {id "2"}}

m和n的交集与预期一致。
是不是很奇怪?也许中间有些东西我不知道也不明白。
Xcode代码10.1

最佳答案

在第一段代码中,您没有使用Equatable协议,但在第二段代码中,您使用了Equatable协议,所以它可以工作。
使用可等式协议进行比较。有关详细信息,请参阅以下链接:
https://useyourloaf.com/blog/swift-equatable-and-comparable/

关于ios - 子类化MKAnnotation原因集集合不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53268268/

10-12 04:45