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
结论:
- Hashable协议遵循Equatable协议,对象要存入Set(集合)必须是可hash的,swift基本类型都是可hash的,自定 义类型对象要存入Set(集合)必须循序 Hashable协议
- 对象进行 == 比较必须遵循Equatable, == 是值比较,不是地址比较
网友评论