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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:45:03