Swift中如何通过循环批量修改多个带数字后缀的状态变量
背景选中状态更新方案
推荐方案:重构为数组存储状态
你当前定义的多个带数字后缀的选中状态变量,本质是有序的同类型状态集合,使用数组存储是最符合数据结构逻辑的方案,后续维护和扩展成本极低:
- 替换原有变量定义
你可以把6个独立变量替换为长度为7的数组(下标1~6直接对应背景编号,无需额外做索引偏移):
// 下标0未使用,下标1~6对应第1~6个背景的选中状态 var achtergrondSelected: [Int] = Array(repeating: 0, count: 7) // 初始默认选中第1个背景 achtergrondSelected[1] = 1
- 实现通用更新方法
后续不管选中第几个背景,直接调用方法批量赋值即可,不需要手动修改每个变量:
/// 更新选中的背景 /// - Parameter n: 选中的背景编号,范围1~6 func updateSelectedBackground(n: Int) { guard (1...6).contains(n) else { return } // 所有状态先重置为0 for index in 1...6 { achtergrondSelected[index] = 0 } // 选中的对应位置设为1 achtergrondSelected[n] = 1 }
需要选中第4个背景时,只需要调用updateSelectedBackground(n: 4)即可。如果后续需要新增背景选项,只需要修改数组长度和判断的范围即可,不需要新增独立变量,扩展性更强。
不推荐方案:动态拼接变量名赋值
如果你实在不愿意修改现有变量定义,可以通过动态访问属性的方式实现循环赋值,但该方式没有编译期校验,拼写错误、变量改名都会导致运行时崩溃,调试成本极高,仅作为参考:
以Swift为例,可以通过KVC的方式动态赋值:
// 要求所有achtergrondSelected开头的变量都在当前类中定义,且类继承自NSObject func updateSelectedBackground(n: Int) { for index in 1...6 { let propertyName = "achtergrondSelected\(index)" setValue(index == n ? 1 : 0, forKey: propertyName) } }
如果是其他语言,也可以对应使用语言提供的动态属性访问能力实现,比如JavaScript可以用window[变量名]、Python可以用getattr/setattr等。
内容的提问来源于stack exchange,提问作者Jef Janssen
相关产品推荐
相关产品推荐

