Хорошо, что-то странное происходит при написании собственного оператора equals для подклассов NSObject в Swift 2.0 следующим образом:
func ==(lhs: MyObject, rhs: MyObject) -> Bool {
return lhs.identifier == rhs.identifier
}
Для класса, который выглядит так:
class MyObject: NSObject {
let identifier: String
init(identifier: String) {
self.identifier = identifier
}
}
Это очень хорошо работает в Swift 1.2 и ниже. Это все еще вроде работы:
let myObject1 = MyObject(identifier: "A")
let myObject2 = MyObject(identifier: "A")
let result = (myObject1 == myObject2)
// result is true
До сих пор так хорошо, но что, если обе переменные были опциями?
let myObject1: MyObject? = MyObject(identifier: "A")
let myObject2: MyObject? = MyObject(identifier: "A")
let result = (myObject1 == myObject2)
// result is false, equals operator was never even called
И еще одна вещь, которая больше не работает:
let myObject1 = MyObject(identifier: "A")
let myObject2 = MyObject(identifier: "A")
let result = (myObject1 == myObject2)
// result is true
let result = (myObject1 != myObject2)
// result is true, equals operator was never even called
Таким образом, очевидно,!= больше не вызывает оператор == и отрицает его. Кажется, что просто сравнивайте экземпляры при использовании!=
Все это происходит только тогда, когда ваш класс является подклассом NSObject (прямо или косвенно). Когда это не так, все работает так, как вы ожидали.
Может ли кто-нибудь сказать мне, является ли это новой "функцией" в Swift 2.0 или просто неприятной ошибкой?