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)") } }
逻辑说明
- 统计名字出现次数:用字典记录每个名字在现有dogs中的数量,为后续去重提供依据
- 去重处理:
- 非必填名字(如示例4中的Shadow)全部保留
- 必填名字仅保留第一个出现的实例,多余的直接过滤
- 补充缺失对象:遍历必填名字列表,检查是否存在,不存在则创建并添加
- 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
相关产品推荐
相关产品推荐

