In Objective-C, it says If two objects are equal, they must have the same hash value. This last > point is particularly important if you define isEqual: in a subclass and > intend to put instances of that subclass into a collection. Make sure you > also define hash in your subclass.
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html#//apple_ref/occ/intfm/NSObject/isEqual: > So the conclusion is that hash can be override. However, in Swift, things go a little odd. Below code works in both Swift 2.2(Xcode 7.3.1) and Swift 3.0(Xcode 8 beta 6). func ==(lhs: Fruit, rhs: Fruit) -> Bool { print(lhs.hashValue) print(rhs.hashValue) return lhs.name == rhs.name } func ==(lhs: Apple, rhs: Apple) -> Bool { return lhs.name == rhs.name && lhs.shape == rhs.shape } func ==(lhs: Banana, rhs: Banana) -> Bool { return lhs.name == rhs.name && lhs.shape == rhs.shape } class Fruit:Hashable { let name:String var hashValue: Int { return 0 } init(_ name:String = "common fruit") { self.name = name } } enum FruitShape:Int { case small = 1000 case medium = 2000 case big = 3000 } class Apple:Fruit { let shape:FruitShape = .medium override var hashValue: Int { return 5 } } class Banana:Fruit { let shape:FruitShape = .big override var hashValue: Int { return 10 } } let apple = Apple() let banana = Banana() print(apple == banana) /* 5 10 true */ My question is, apple equals banana, but their hashValues (in their own types) don't. What's wrong here? Is that means we shouldn't override hashValue in subclass in Swift? Zhaoxin
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users