Предположим, у меня есть базовый класс «Человек», который я хочу добавить в 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
}
Этот класс имеет только одно необязательное свойство, что делает работу с необязательным при создании хэш-значения достаточно разумной. Что, если бы было 2 или более необязательных свойства? Я вижу, что это довольно быстро выходит из-под контроля.
Как обычно обрабатываются необязательные свойства при согласовании объекта с хешируемым протоколом?