После обновления нашей кодовой базы до Swift2 я столкнулся с необычной проблемой. Набор не вычитает и не объединяет, как ожидалось.Swift 2.0 Set работает не так, как ожидалось, когда содержится подкласс 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
Похоже, что новый набор не использует hashValue для внутренних операций. Любая идея заключается в том, что ошибка или способ обхода этой проблемы?
Спасибо! У меня возникла проблема с подклассом MKAnnotation (который также должен расширять NSObject). У вас есть ссылка на документацию по этому вопросу? – brki
Оба isEqual и hashValue, кажется, необходимы, чтобы сделать Set правильно с NSObject в Swift 3 –