You need to enable JavaScript to run this app. SwiftUI:检测非当前标签内重复值触发Alert,修复弹窗误触发问题
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI:检测非当前标签内重复值触发Alert,修复弹窗误触发问题

原有逻辑的缺陷说明

当前Alert永远无差别弹出的核心原因有两点:

  • 遍历范围没有排除当前正在编辑的tm:tm本身就是存储在dm.storageTags数组中的实例,原判断没有过滤自身元素,必然会命中匹配条件
  • 判定粒度不匹配业务规则:直接用两个完整的value数组做相等对比,不符合“单个ValueModel仅归属一个标签”的判定逻辑,既容易命中自身,也无法精准定位跨标签的重复元素
正确的重复检测实现逻辑

按照业务要求分三步落地检测流程:

  1. 缩小遍历范围:从dm.storageTags中过滤出所有和当前编辑tm的id不相等的标签实例,完全排除当前编辑对象的干扰
  2. 精准匹配重复:逐个对比当前tm.value中的元素id(ValueModel遵循Identifiable,id是唯一标识),检查其他标签的value数组中是否存在同id的ValueModel
  3. 条件触发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 20:24:04