You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:15:03