iOS Swift中比较两个模型数组修改is_selected值的实现方法
实现方案
首先需要先修正模型定义的小问题,再通过快速映射的方式完成匹配更新,具体步骤如下:
第一步:补全/修正模型定义
你当前贴出的代码缺少SubCategory的定义,而且如果要修改is_selected属性,需要把该属性声明为可修改的var类型:
// MARK: - SubCategory class SubCategory: Codable { let sub_category_name: String // 必须改为var才能修改属性值,声明为let会报错 var is_selected: Bool enum CodingKeys: String, CodingKey { case sub_category_name, is_selected } init(subCategoryName: String, isSelected: Bool) { self.sub_category_name = subCategoryName self.is_selected = isSelected } } // 原有Item模型无需修改,因为class是引用类型,直接修改子元素属性即可
第二步:构建快速查询映射
先把resultArray转换为[分类名: 需要选中的子分类名集合]的字典结构,相比嵌套循环匹配,查询效率更高,尤其适合数据量大的场景:
var selectedMap = [String: Set<String>]() for resultItem in resultArray { let subNames = resultItem.sub_category.map { $0.sub_category_name } selectedMap[resultItem.category_name] = Set(subNames) }
第三步:更新mainArray的选中状态
遍历mainArray,通过提前构建的映射快速匹配,把符合条件的子项is_selected设为true:
for mainItem in mainArray { // 分类不在选中映射里直接跳过 guard let selectedSubNames = selectedMap[mainItem.category_name] else { continue } // 子分类名在选中集合里就修改选中状态 for subItem in mainItem.sub_category { if selectedSubNames.contains(subItem.sub_category_name) { subItem.is_selected = true } } }
注意事项
如果你的SubCategory是struct值类型,上面的遍历修改代码需要调整为下标修改,因为值类型遍历获取的是拷贝,直接修改不会生效,调整后的代码如下:
for mainIndex in mainArray.indices { var mainItem = mainArray[mainIndex] guard let selectedSubNames = selectedMap[mainItem.category_name] else { continue } for subIndex in mainItem.sub_category.indices { if selectedSubNames.contains(mainItem.sub_category[subIndex].sub_category_name) { mainItem.sub_category[subIndex].is_selected = true } } mainArray[mainIndex] = mainItem }
内容的提问来源于stack exchange,提问作者Zubin
相关产品推荐
相关产品推荐

