美文网首页
swift自定义值类型做字典的key注意!!!

swift自定义值类型做字典的key注意!!!

作者: litt1err | 来源:发表于2017-11-28 17:20 被阅读34次
应该都知道,swift的字典key只要实现Hashable协议就都可以做为key使用了(不知道的可以command进去看一下),我主要是介绍一下在我自定义key实现hashable的坑。
  • hash值计算的时间复杂度
  • 异或运算结果误差

hash值计算的时间复杂度

public protocol Hashable : Equatable {

    /// The hash value.
    ///
    /// Hash values are not guaranteed to be equal across different executions of
    /// your program. Do not save hash values to use during a future execution.
    public var hashValue: Int { get }
}

我们需要返回的hashValue。 返回值Int->对应我们自定义的值类型的hash值

当我们每次去获取dictionary的时候,都会走上面 public var hashValue: Int { get }闭包

那么我们去读字典的操作时间复杂度=闭包里面的时间复杂度
如果闭包里面有消耗性能的O(n)计算,那访问字典就比较消耗性能了

异或运算结果误差

写放一个我写的例子

struct Account {
    var age: Int
    var height: Float
}

extension Account: Hashable,Equatable {
    var hashValue: Int {
        return age.hashValue ^
            height.hashValue
        
    }
    
    static func ==(lhs: Account, rhs: Account) -> Bool {
        return lhs.age == rhs.age &&
            lhs.height == rhs.height
    }

}

 var account1 = Account(age: 18, height: 180)

一般我们通过异或运算进行一些低消耗的运算。但是我们知道a ^ b是等于b ^ a的,也就是如果Account里面俩个属性的值颠倒过来,那么account1的hash值其实是不变的

算是愚见了,分享出来,希望大家多指点。自己可以多学习!
最后我们一般是尽可能的避免使用引用类型作为key,这通常会给你带来不必要的麻烦。当我们使用引用类型作为key之后,引用类型的对象在Dictionary之外被修改的时候,Key的内容也会随之修改。key对应的哈希值是改变的,这样就无法获得对应的value了。

相关文章

  • swift自定义值类型做字典的key注意!!!

    应该都知道,swift的字典key只要实现Hashable协议就都可以做为key使用了(不知道的可以command...

  • Day8-元组,字典和集合

    一、认识类型 二、增删改查 注意: 字典的查询: a.字典[key] ---> 获取key对应的值(key值必须...

  • swift学习-字典(Dictionary)

    字典类型快捷语法 swift的字典使用Dictionary定义,其中Key是字典中键的数据类...

  • Note 3 Swift (1)

    Swift学习笔记 变量与常量 变量 常量 值类型与引用类型 值类型 引用类型 数组与字典 数组 字典

  • 字典

    字典---可变数据类型 更新字典: 如果key值存在的话: mydict[key] = value ...

  • Swift Hashable

    Hashable 你可以使用你自定义的类型作为合集的值类型或者字典的键类型,只要让它们遵循Swift基础库的Has...

  • Swift 3.0 字典

    字典 swift 字典不仅可以存储对象类型的值,还可以存储基本数据类型的值,结构体,枚举值。字典本质上也是结构体。...

  • swift基础语法(字典)

    字典的 Key类型必须遵循 Hashable协议,就像合集的值类型。 1、定义字典 2、创建空字典 3、添加元素 ...

  • day9-课程总结

    1.字典 增:字典[key] = 值; 字典.setdefaule(key, 值);字典.update(字典)删:...

  • 遍历python字典几种方法

    用for语句可以遍历取出字典中的key值,通过key值得到相对应的内容值 注意:遍历中字典的值可以保证,但是顺序是...

网友评论

      本文标题:swift自定义值类型做字典的key注意!!!

      本文链接:https://www.haomeiwen.com/subject/omsjlxtx.html