Swift中基于id属性向Set插入唯一值的问题求助
基于唯一ID的Hashable结构体实现方案
你遇到的问题根源在于:Set 依赖 Hashable 协议的两个核心部分——相等性判断(== 运算符)和哈希值计算。只实现 == 而不自定义哈希逻辑的话,相同 id 的结构体实例可能生成不同的哈希值,导致 Set 误判为不同元素,从而出现插入结果不稳定的情况。
正确的Hashable实现方式
要让 Set 仅根据 id 判断唯一性,需要同时覆盖 == 运算符和 hash(into:) 方法,确保相同 id 的实例既满足相等性,又生成一致的哈希值:
struct SomeStruct: Hashable { let id: String // 唯一标识 let date: String let comment: String static func ==(lhs: SomeStruct, rhs: SomeStruct) -> Bool { lhs.id == rhs.id } func hash(into hasher: inout Hasher) { // 仅使用id生成哈希值 hasher.combine(id) } }
这样实现后,测试你的插入逻辑就能得到稳定的结果:
var someSet: Set<SomeStruct> = [] someSet.insert(SomeStruct(id: "1", date: "22.09.2022", comment: "nothing here")) // inserted: true someSet.insert(SomeStruct(id: "1", date: "05.12.1978", comment: "something here!")) // inserted: false, not unique id
更优替代方案:字典映射
如果你的场景需要频繁通过 id 查找结构体实例,用字典存储(以 id 为键,结构体为值)会更灵活,同样能保证 id 的唯一性:
var structDictionary: [String: SomeStruct] = [:] // 插入逻辑模拟Set的insert返回值 let firstStruct = SomeStruct(id: "1", date: "22.09.2022", comment: "nothing here") if structDictionary[firstStruct.id] == nil { structDictionary[firstStruct.id] = firstStruct print("inserted: true") } else { print("inserted: false") } let duplicateStruct = SomeStruct(id: "1", date: "05.12.1978", comment: "something here!") if structDictionary[duplicateStruct.id] == nil { structDictionary[duplicateStruct.id] = duplicateStruct print("inserted: true") } else { print("inserted: false, not unique id") }
这种方式不仅能保证唯一性,还能通过 id 直接获取对应的结构体实例,比 Set 更适合需要快速查找的场景。
内容的提问来源于stack exchange,提问作者user19931576
相关产品推荐
相关产品推荐

