Sau khi nâng cấp codebase của chúng tôi lên Swift2, tôi đã gặp sự cố bất thường. Thiết lập không phải là trừ đi cũng như đoàn kết như mong đợi.Swift 2.0 Đặt không hoạt động như mong đợi khi chứa lớp con NSObject
class A: NSObject {
let h: Int
init(h: Int) {
self.h = h
}
override var hashValue: Int {
return h
}
}
func ==(lhs: A, rhs: A) -> Bool {
return lhs.hashValue == rhs.hashValue
}
let a = A(h: 1)
let b = A(h: 1)
var sa = Set([a])
let sb = Set([b])
sa.subtract(sb).count // Swift1.2 prints 0, Swift 2 prints 1
sa.contains(a) // Swift1.2 true, Swift 2 true
sa.contains(b) // Swift1.2 true, Swift 2 false
Có vẻ như Set mới không sử dụng hashValue cho các hoạt động nội bộ. Bất kỳ ý tưởng nào là một lỗi hay một cách giải quyết vấn đề này?
Cảm ơn bạn! Tôi đã gặp vấn đề này với một lớp con MKAnnotation (cũng cần mở rộng NSObject). Bạn có liên kết đến một số tài liệu về chủ đề này không? – brki
Cả hai isEqual và hashValue dường như là cần thiết để làm cho Đặt đúng với NSObject trong Swift 3 –