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

Swift中如何匹配Bool数组与标题数组索引获取选中产品

方案合理性判断

通过索引关联选择状态数组和产品名称数组的方案,在两个数组长度、元素顺序始终严格一致的前提下可以正常运行,但可维护性较差——后续如果对数组做插入、删除、重排序操作,很容易出现两个数组不同步导致的取值错误,更推荐将状态和产品名封装为统一模型管理。下面先给出适配你现有代码结构的可运行实现,再提供优化方案。

现有代码结构的实现

你只需要在每次用户修改选择状态后,遍历状态数组的枚举值,匹配选中项对应索引的产品名即可,自动支持全选、多选、不选三种场景:

func refreshSelectedProducts() {
    // 清空上次的选中结果,避免重复累加
    selectedProducts.removeAll()
    
    for (index, selectedFlag) in array1.enumerated() {
        // 校验当前项为选中状态,同时避免产品数组越界
        guard selectedFlag == "true", array2.indices.contains(index) else {
            continue
        }
        selectedProducts.append(array2[index])
    }
}

逻辑说明:

  • 不选场景:array1中没有"true"值,遍历完成后selectedProducts为空数组
  • 多选场景:所有值为"true"的索引对应的产品名都会被追加到结果数组
  • 全选场景:array1所有值为"true"时,array2所有产品都会被加入结果数组

每次用户点击选择/取消选择后,调用一次上述方法就能得到最新的选中产品列表。

推荐的优化实现

用独立模型绑定产品名和选择状态,从根源上避免索引不匹配的问题:

// 定义产品数据模型
struct Product {
    let name: String
    var isSelected: Bool
}

// 用单一数组管理所有产品,替代原来的两个独立数组
var productList: [Product] = [
    Product(name: "apples", isSelected: false),
    Product(name: "bananas", isSelected: true),
    Product(name: "coconuts", isSelected: false)
]

// 通过计算属性直接获取选中产品,无需手动同步索引
var selectedProducts: [String] {
    productList.filter(\.isSelected).map(\.name)
}

该实现下,无论你对产品数组做排序、删除、新增操作,选中结果都能自动正确计算,不需要额外维护两个数组的对应关系,大幅降低后续出bug的概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:27:17