가정하자 나는 기본 클래스 I는 설정 (목록)에 추가 할 "사람"과 따라서 해쉬와 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를 만드는 데있어 선택적 요소를 다루는 것이 상당히 합리적입니다. 2 개 이상의 선택적 속성이 있다면 어떻게 될까요? 나는 이것이 아주 빨리 손에서 벗어나는 것을 볼 수있다.
선택적 속성은 일반적으로 객체를 해시 가능한 프로토콜에 부합시킬 때 어떻게 처리됩니까?
소리가 적당합니다. 아마도 독자적인 토론을위한 주제 일지 모르지만, 향후 문제를 일으킬 수있는 hashValue 계산의 구체성을 줄이는 데 어떤 단점이 있습니까? – BrandonLenz
해시 값이 좋지 않으면 개체를 컬렉션에 저장할 때 성능 문제가 발생할 수 있습니다. – rmaddy
'hashValue'는'=='이'=='일 때 비효율적 일 때 최적화 할 수 있습니다. 해시가 동일하지 않으면 분명히 다른 값을 버릴 수 있습니다. 'hashValue'는 계산을 위해 O (1)이어야합니다. –