Equatable Swift (NS)Objects

How to implement equality with different kinds of Swift objects was pretty obvious once I read the documentation, but the errors I got at first were not entirely clear. If you want to show equality between two objects in Swift, you have to do something different depending on if they subclass NSObject or not.

In the case of an NSObject subclass, you would override -isEqual::

override func isEqual(to object: Any?) -> Bool {
    guard let myObject = object as? MyClass else {
        return false
    }
    return uniqueID == myObject.uniqueID 
}

If it’s a pure Swift object, however, you would implement the Equatable protocol and override ==:

extension MyClass: Equatable {
    static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
        return lhs.uniqueID == rhs.uniqueID
    }
}

If you try to implement Equatable on an NSObject subclass, you will either get compiler errors about redundant conformance, or your implementation of == will never be called and you will be confused.

Collin Donnell @collin