Ok, something strange is happening when writing your own equals operator for NSObject subclasses in Swift 2.0 like this:
func ==(lhs: MyObject, rhs: MyObject) -> Bool {
return lhs.identifier == rhs.identifier
}
For a class that looks like this:
class MyObject: NSObject {
let identifier: String
init(identifier: String) {
self.identifier = identifier
}
}
This used to work just fine in Swift 1.2 and below. It still kind of works:
let myObject1 = MyObject(identifier: "A")
let myObject2 = MyObject(identifier: "A")
let result = (myObject1 == myObject2)
// result is true
So far so good, but what if both of the variables were optionals?
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
And one other thing that no longer works:
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
So apparently, != no longer calls the == operator and negates it. It seems to just compare the instances instead when using !=
All of this only happens when your class is a subclass of NSObject (directly or indirectly). When it's not, everything works just like you would expect.
Can anyone tell me if this is a new 'feature' in Swift 2.0 or just a nasty bug?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…