I want to use instances of a custom class as Dictionary key. This requires the class to conform to Hashable.
func ==(lhs: KeyType1, rhs: KeyType1) -> Bool { return lhs.id == rhs.id } final class KeyType1: Hashable, CustomStringConvertible { let id: String init(id: String) { self.id = id } var hashValue: Int { return id.hashValue } var description: String { return id } } Now I can use KeyType1 instances as key in Dictionary. var collection1 = [KeyType1(id: "foo") : NSObject()] Testing works fine: let key = collection1.first!.0 print(" Key stored in collection: \(unsafeAddressOf(key)) -- \(key)") let keyCopy = KeyType1(id: key.id) print(" Key copy: \(unsafeAddressOf(keyCopy)) -- \(keyCopy)") print(" Keys equal: \(key == keyCopy)") print(" Hash values equal: \(key.hashValue == keyCopy.hashValue)") print(" Collection has item for key: \(collection1[key] != nil)") print("Collection has item for key copy: \(collection1[keyCopy] != nil)") Key stored in collection: 0x0000608000043d80 -- foo Key copy: 0x00006080000440b0 -- foo Keys equal: true Hash values equal: true Collection has item for key: true Collection has item for key copy: true Next, I repeat the same set up -- but this time KeyType is a descendant of NSObject. func ==(lhs: KeyType2, rhs: KeyType2) -> Bool { return lhs.id == rhs.id } final class KeyType2: NSObject { // NSObject conforms to Hashable and CustomStringConvertible. let id: String init(id: String) { self.id = id; super.init() } override var hashValue: Int { return id.hashValue } override var description: String { return id } } Again, I create a Dictionary based on this key class. var collection2 = [KeyType2(id: "foo") : NSObject()] Using the same tests, they fail now. let key = collection2.first!.0 print(" Key stored in collection: \(unsafeAddressOf(key)) -- \(key)") let keyCopy = KeyType2(id: key.id) print(" Key copy: \(unsafeAddressOf(keyCopy)) -- \(keyCopy)") print(" Keys equal: \(key == keyCopy)") print(" Hash values equal: \(key.hashValue == keyCopy.hashValue)") print(" Collection has item for key: \(collection2[key] != nil)") print("Collection has item for key copy: \(collection2[keyCopy] != nil)") Key stored in collection: 0x0000608000044080 -- foo Key copy: 0x00006080000440e0 -- foo Keys equal: true Hash values equal: true Collection has item for key: true Collection has item for key copy: false What am I missing here? Thanks Etan
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users