-
字典查找将返回的是可选值,当特定建不存在时,下标查询会返回nil。
-
字典其实就是哈希表。字典通过键的hashValue来为每个键指定一个位置,以及它所对应的存储。
标准库中所有的基本数据类型都是遵守Hashable协议的,它们包括字符串、整数、浮点数以及布尔值。不带有关联值的枚举类型也会自动遵守Hashable。
如果你想要将自定义的类型用作字典的键,那么你必须手动为你的类型添加Hashable并满足它,这需要你实现hashValue属性。
另外,因为Hashable本身是对Equatable的拓展,因此,还需要实现重载==运算符。
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.当你使用不具有语义的类型作为字典的键时,需要特别小心。如果你在将一个对象用作字典键后,改变了它的内容,它的哈希值和/或相等特性往往会发生改变。这时候你将无法在字典中找到它。这时字典会在错误的位置存储对象,这将倒置字典内部存储错误。对于值类型来说,因为字典的键不会和复制的值公用存储,因此它也不会被从外部改变,所以不存在这个问题。
网友评论