I think this is an NSObject problem.
class MYUserNSObject: NSObject { dynamic var fullName: String init(fullName: String) { self.fullName = fullName super.init() } } func ==(left: MYUserNSObject, right: MYUserNSObject) -> Bool { return left.fullName == right.fullName } let objectUsers = [MYUserNSObject(fullName: "a"), MYUserNSObject(fullName: "b")] let objectResult = objectUsers.contains(MYUserNSObject(fullName: "a")) print("\(result)")
Prints false.
class MYUserSwift: Equatable { var fullName: String init(fullName: String) { self.fullName = fullName } } func ==(left: MYUserSwift, right: MYUserSwift) -> Bool { return left.fullName == right.fullName } let swiftUsers = [MYUserSwift(fullName: "a"), MYUserSwift(fullName: "b")] let swiftResult = swiftUsers.contains(MYUserSwift(fullName: "a")) print("\(swiftResult)")
Prints true.
Finally, adding -isEqual: I fixed it.
class MYUserNSObject: NSObject { dynamic var fullName: String init(fullName: String) { self.fullName = fullName super.init() } override func isEqual(object: AnyObject?) -> Bool { guard let user = object as? MYUserNSObject else { return false } return self == user } } func ==(left: MYUserNSObject, right: MYUserNSObject) -> Bool { return left.fullName == right.fullName } let objectUsers = [MYUserNSObject(fullName: "a"), MYUserNSObject(fullName: "b")] let objectResult = objectUsers.contains(MYUserNSObject(fullName: "a")) print("\(objectResult)")
Prints true.
Updated for Swift 4.0
class MYUserNSObject: NSObject { @objc var fullName: String init(fullName: String) { self.fullName = fullName super.init() } override func isEqual(_ object: Any?) -> Bool { guard let user = object as? MYUserNSObject else { return false } return self.fullName == user.fullName } } let objectUsers = [MYUserNSObject(fullName: "a"), MYUserNSObject(fullName: "b")] let objectResult = objectUsers.contains(MYUserNSObject(fullName: "a")) print("\(objectResult)")
Prints true.
Note: the function ==(left:right:) no longer required.
let success = MYUserNSObject(fullName: "a") == objectUsers[0] print("success should be true: \(success)") let failure = MYUserNSObject(fullName: "a") == objectUsers[1] print("failure should be false: \(failure)")
source share