Swift中Set内对象如何基于属性正确遵循Hashable协议实现去重
问题原因
你现在的去重逻辑失效,核心是TTDTag的Hashable协议实现用了唯一UUID作为判断依据:哪怕两个标签的描述完全一致,只要是不同实例,==判断返回false,哈希值也不同,Set自然不会认为是同一个元素无法去重。
解决方案
根据你的业务需求可以二选一:
方案1:全局修改TTDTag的相等规则
如果业务上确实认为「标签描述相同就是同一个标签」,直接调整TTDTag的Hashable和Equatable实现即可:
class TTDTag: Identifiable, Hashable { // 保留id满足Identifiable协议要求,不参与相等判断 var id: UUID = UUID() var TTDTagDesc: String init(TTDTagDesc: String){ self.TTDTagDesc = TTDTagDesc } static func ==(lhs: TTDTag, rhs: TTDTag) -> Bool { // 仅按标签描述判断相等 return lhs.TTDTagDesc == rhs.TTDTagDesc } func hash(into hasher: inout Hasher) { // 哈希计算也仅基于标签描述 hasher.combine(TTDTagDesc) } }
改完之后你原来的itemTagsList方法不需要做任何修改,就能直接返回按描述去重后的标签集合。
方案2:仅在生成全量标签集时单独处理
如果其他业务场景仍然需要按UUID区分标签实例,不想修改全局相等规则,可以调整itemTagsList的实现逻辑,单独按描述去重:
func itemTagsList()-> Set<TTDTag> { var uniqueTags = Set<TTDTag>() var existedDescs = Set<String>() for item in itemList { for tag in item.itemTags { if !existedDescs.contains(tag.TTDTagDesc) { existedDescs.insert(tag.TTDTagDesc) uniqueTags.insert(tag) } } } return uniqueTags }
内容的提问来源于stack exchange,提问作者Manuel Zompetta
相关产品推荐
相关产品推荐

