字典查找將返回的是可選值失晴,當(dāng)特定建不存在時(shí)恨樟,下標(biāo)查詢會返回nil。
字典其實(shí)就是哈希表幽纷。字典通過鍵的hashValue來為每個鍵指定一個位置式塌,以及它所對應(yīng)的存儲。
標(biāo)準(zhǔn)庫中所有的基本數(shù)據(jù)類型都是遵守Hashable協(xié)議的友浸,它們包括字符串峰尝、整數(shù)、浮點(diǎn)數(shù)以及布爾值收恢。不帶有關(guān)聯(lián)值的枚舉類型也會自動遵守Hashable境析。
如果你想要將自定義的類型用作字典的鍵,那么你必須手動為你的類型添加Hashable并滿足它派诬,這需要你實(shí)現(xiàn)hashValue屬性劳淆。
另外,因?yàn)镠ashable本身是對Equatable的拓展,因此默赂,還需要實(shí)現(xiàn)重載==運(yùn)算符沛鸵。
struct Person{
var name:String
var zipCode:Int
var birthday:Date
}
extension Person : Equatable {
static func == (lhs:Person,rhs:Person)->Bool{
return lhs.name == rhs.name && lhs.zipCode == rhs.zipCode && lhs.birthday == rhs.birthday
}
}
extension Person : Hashable {
var hashValue: Int{
return name.hashValue*zipCode.hashValue*birthday.hashValue
}
}
3.當(dāng)你使用不具有語義的類型作為字典的鍵時(shí),需要特別小心缆八。如果你在將一個對象用作字典鍵后曲掰,改變了它的內(nèi)容,它的哈希值和/或相等特性往往會發(fā)生改變奈辰。這時(shí)候你將無法在字典中找到它栏妖。這時(shí)字典會在錯誤的位置存儲對象,這將倒置字典內(nèi)部存儲錯誤奖恰。對于值類型來說吊趾,因?yàn)樽值涞逆I不會和復(fù)制的值公用存儲宛裕,因此它也不會被從外部改變,所以不存在這個問題论泛。