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

Swift中如何通过contains(where:)获取目标对象,实现增删重复与缺失元素

解决方案

要实现「不存在的对象创建,重复对象删除一个」的需求,你原来的代码逻辑存在两个核心问题:一是contains(where:)只能判断存在性,无法直接获取匹配对象;二是通过遍历必填名字统计次数的方式,无法正确识别dogs数组内的重复项。以下是修正后的完整实现:

修正后的代码

func dogCleanup() {
    let requiredDogNames = ["Teddy", "Browny", "Mia"]
    
    // 1. 统计现有狗狗的名字出现次数
    var nameOccurrence = [String: Int]()
    for dog in dogs {
        let name = dog.name ?? ""
        nameOccurrence[name] = (nameOccurrence[name] ?? 0) + 1
    }
    
    // 2. 去重:保留每个必填名字的一个实例,保留所有非必填名字
    var filteredDogs = [Dog]()
    var keptNames = Set<String>()
    for dog in dogs {
        let name = dog.name ?? ""
        if !requiredDogNames.contains(name) {
            // 非必填名字全部保留
            filteredDogs.append(dog)
        } else if !keptNames.contains(name) {
            // 必填名字只保留第一个出现的实例
            filteredDogs.append(dog)
            keptNames.insert(name)
        }
    }
    dogs = filteredDogs
    
    // 3. 添加缺失的必填狗狗
    for name in requiredDogNames {
        if !dogs.contains(where: { $0.name == name }) {
            // Core Data 创建新对象(需传入上下文)
            let newDog = Dog(context: persistentContainer.viewContext)
            newDog.name = name
            dogs.append(newDog)
        }
    }
    
    // 保存Core Data上下文(必须执行,否则修改不会持久化)
    do {
        try persistentContainer.viewContext.save()
    } catch {
        print("Core Data保存失败: \(error.localizedDescription)")
    }
}

逻辑说明

  1. 统计名字出现次数:用字典记录每个名字在现有dogs中的数量,为后续去重提供依据
  2. 去重处理:
    • 非必填名字(如示例4中的Shadow)全部保留
    • 必填名字仅保留第一个出现的实例,多余的直接过滤
  3. 补充缺失对象:遍历必填名字列表,检查是否存在,不存在则创建并添加
  4. Core Data持久化:最后必须保存上下文,确保所有修改写入数据库

对应示例验证

示例1

现有dogs:[Dog(name: "Teddy"), Dog(name: "Browny"), Dog(name: "Mia")]
处理后:无重复无缺失,结果为 Teddy,Browny,Mia

示例2

现有dogs:[Dog(name: "Teddy"), Dog(name: "Browny")]
处理后:自动添加Mia,结果为 Teddy, Browny, Mia

示例3

现有dogs:[Dog(name: "Teddy"), Dog(name: "Browny"), Dog(name: "Browny")]
处理后:删除一个Browny并添加Mia,结果为 Teddy, Browny, Mia

示例4

现有dogs:[Dog(name: "Teddy"), Dog(name: "Browny"), Dog(name: "Browny"), Dog(name: "Shadow")]
处理后:删除一个Browny、添加Mia、保留Shadow,结果为 Teddy, Browny, Mia, Shadow

内容的提问来源于stack exchange,提问作者fs_tigre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:12:15