SwiftUI:检测非当前标签内重复值触发Alert,修复弹窗误触发问题
原有逻辑的缺陷说明
当前Alert永远无差别弹出的核心原因有两点:
- 遍历范围没有排除当前正在编辑的
tm:tm本身就是存储在dm.storageTags数组中的实例,原判断没有过滤自身元素,必然会命中匹配条件 - 判定粒度不匹配业务规则:直接用两个完整的value数组做相等对比,不符合“单个ValueModel仅归属一个标签”的判定逻辑,既容易命中自身,也无法精准定位跨标签的重复元素
正确的重复检测实现逻辑
按照业务要求分三步落地检测流程:
- 缩小遍历范围:从
dm.storageTags中过滤出所有和当前编辑tm的id不相等的标签实例,完全排除当前编辑对象的干扰 - 精准匹配重复:逐个对比当前tm.value中的元素id(ValueModel遵循Identifiable,id是唯一标识),检查其他标签的value数组中是否存在同id的ValueModel
- 条件触发Alert:仅当检测到跨标签的重复ValueModel时,才弹出包含“迁移/取消”选项的Alert,无重复时直接执行保存逻辑
核心实现代码
// 1. 过滤得到所有非当前编辑对象的其他标签 let otherTags = dm.storageTags.filter { $0.id != tm.id } // 2. 找出当前tm.value中,存在于其他标签里的重复ValueModel let duplicatedValues = tm.value.filter { currentValue in otherTags.contains { tag in tag.value.contains { $0.id == currentValue.id } } } // 3. 按检测结果分支处理 if !duplicatedValues.isEmpty { // 弹出Alert:询问用户是否将重复值从原标签移除、迁移到当前标签 } else { // 直接保存无冲突的修改 }
实现注意点
- 使用id做重复判定是最严谨的选择,避免临时修改ValueModel的name、notes、expires等属性时出现误判
- 触发Alert时可以把收集到的
duplicatedValues作为上下文传入,后续用户选择迁移操作时可以直接对应找到原标签做移除操作,不需要再次遍历匹配
内容的提问来源于stack exchange,提问作者Pandruz
相关产品推荐
相关产品推荐

