Swift:寻求更简洁清晰的数组切换实现方案
优化后的实现方案
核心改进思路
- 用计算属性替代
activeArray的存储属性,直接关联activeArrayIndex和arrays,砍掉双向绑定的冗余代码 - 用Swift高阶函数简化初始化逻辑,告别繁琐循环
- 加索引合法性校验,杜绝越界崩溃风险
优化后的代码
struct Zot {} class Foo { // 存储当前激活的索引,自动修正非法值 var activeArrayIndex: Int = 0 { didSet { activeArrayIndex = max(0, min(arrays.count - 1, activeArrayIndex)) } } // 计算属性直接映射arrays对应位置,不用额外存储 var activeArray: [Zot] { get { arrays[activeArrayIndex] } set { arrays[activeArrayIndex] = newValue } } var arrays: [[Zot]] = [] init(zotArrays: [Zot]) { // 一行代码把每个Zot转成单元素数组 arrays = zotArrays.map { [$0] } // 空输入时自动加一个空数组 if arrays.isEmpty { arrays.append([]) } activeArrayIndex = 0 } }
细节说明
- 计算属性
activeArray:
读取时直接取arrays对应索引的元素,写入时直接修改arrays的对应位置,完全省去了原来两个存储属性互相触发didSet的冗余逻辑,代码更清爽。 - 索引合法性校验:
给activeArrayIndex加了边界限制,哪怕外部传了超出范围的索引,也会自动修正到合法区间,再也不用担心数组越界崩溃。 - 初始化简化:
用map替代原来的for循环,把输入数组里的每个元素转换成单元素数组,一行搞定,符合Swift的函数式风格。
适配5个按钮的额外优化
如果你的5个按钮对应固定5组数组,哪怕输入的zotArrays元素不够5个,也可以初始化时补全到5个:
init(zotArrays: [Zot]) { arrays = zotArrays.map { [$0] } // 补全到5个数组,不足的用空数组填充 while arrays.count < 5 { arrays.append([]) } activeArrayIndex = 0 }
内容的提问来源于stack exchange,提问作者Tiny Tim
相关产品推荐
相关产品推荐

