假设我有一个基类 "Person",我想将其添加到 Set(List)中,并因此需要符合 Hashable 和 Equatable:
class Person : Equatable, Hashable {
let firstName: String
let lastName: String
var nickname: String?
let dateOfBirth: NSDate
var hashValue: Int {
if let nickname = nickname {
return firstName.hashValue ^
lastName.hashValue ^
nickname.hashValue ^
dateOfBirth.hashValue
} else {
return firstName.hashValue ^
lastName.hashValue ^
dateOfBirth.hashValue
}
}
init (firstName: String, lastName: String, nickname: String, bornOn dateOfBirth: NSDate) {
self.firstName = firstName
self.lastName = lastName
self.nickname = nickname
self.dateOfBirth = dateOfBirth
}
}
func ==(lhs: Person, rhs: Person) -> Bool {
return
lhs.firstName == rhs.firstName &&
lhs.lastName == rhs.lastName &&
lhs.nickname == rhs.nickname &&
lhs.dateOfBirth == rhs.dateOfBirth
}
这个类只有一个可选属性,这使得在创建哈希值时处理可选项相当合理。如果有两个或更多的可选属性会怎样呢?我可以很快地看出这种情况会变得难以控制。
当符合对象的哈希协议时,通常如何处理可选属性?
==
操作很耗费资源时,hashValue
也可以用作其优化。如果两个对象的哈希值不同,就可以快速地将它们排除在显然不相等的范围之外。计算hashValue
的时间复杂度应为O(1)。 - Rob Napier