美文网首页
swift Hashable, Equatable测试

swift Hashable, Equatable测试

作者: 摘心 | 来源:发表于2019-08-07 15:10 被阅读0次
do {
    struct Model : Hashable {
        var name:String
        var num:Int
    }
    
    let mode1 = Model(name: "mode1", num: 1)
    let mode2 = Model(name: "mode2", num: 2)
    let modelSet:Set = [mode1, mode2]
    for model in modelSet {
        print("test1  name : \(model.name)")
    }
    var mode3 = mode1
    if mode1 == mode3 {
        print("test2  mode1 == mode3")
    }
    
    mode3.num = 3
    
    if mode1 == mode3 {
        print("test3  mode1 == mode3")
    }
    
    print(mode3.hashValue)
    print(mode1.hashValue)
}

do {
    struct Model : Equatable {
        var name:String
        var num:Int
    }
    
    var mode1 = Model(name: "mode1", num: 1)
    // 不符合Hashable协议的对象不能使用==判断
//     let modelSet:Set = [mode1]
    //
    var mode2 = mode1
    
    if mode1 == mode2 {
        print("test4  mode1 == mode2")
    }
    // struct是值类型,= 赋值语句是深copy,
    // mode1 == mode2 比较的是值而不是内存地址
    withUnsafePointer(to: &mode1) { (p) in
        print("test5 mode1 pointer : \(p)")
    }
    
    withUnsafePointer(to: &mode2) { (p) in
        print("test5 mode2 pointer : \(p)")
    }
}


do {
    struct Model {
        var name:String
        var num:Int
    }

    let mode1 = Model(name: "mode1", num: 1)
    // 不符合Hashable协议的对象不能写入Set
//    let modelSet:Set = [mode1]

      // 不符合Hashable协议的对象不能使用==判断
    let mode2 = mode1
//    if mode1 == mode2 {
//        print("mode1 == mode3")
//    }
}

输出结果:

test1  name : mode2
test1  name : mode1
test2  mode1 == mode3
1444735950261577421
-1126343340540097481
test4  mode1 == mode2
test5 mode1 pointer : 0x00007ffeef27bc70
test5 mode2 pointer : 0x00007ffeef27bcb0

结论:

  1. Hashable协议遵循Equatable协议,对象要存入Set(集合)必须是可hash的,swift基本类型都是可hash的,自定 义类型对象要存入Set(集合)必须循序 Hashable协议
  2. 对象进行 == 比较必须遵循Equatable, == 是值比较,不是地址比较

相关文章

网友评论

      本文标题:swift Hashable, Equatable测试

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