Swift中如何更简洁高效地按模式生成指定长度的颜色数组?
代码优化建议
1. 移除不必要的@State变量,改用计算属性
原代码中newColorArray用@State存储完全没必要——colorArray和arrayLength都是固定值,直接通过计算属性生成重复数组即可,既省去onAppear的额外逻辑,也减少了视图状态管理的开销。
2. 简化数组重复逻辑,用取模运算替代手动索引重置
原newArray函数里的索引判断可以用取模运算直接实现循环,代码更简洁高效,不需要手动重置colorI变量。
3. 优化ForEach遍历方式
直接遍历生成的颜色数组(结合id: \.self),比通过索引遍历更符合SwiftUI的设计习惯,代码可读性更强。
优化后的完整代码:
import SwiftUI struct ContentView: View { private let colorPattern: [Color] = [.blue, .green, .red] private let targetLength: Int = 4 // 计算属性:直接生成重复到指定长度的颜色数组 private var repeatedColors: [Color] { guard !colorPattern.isEmpty else { return [] } return (0..<targetLength).map { colorPattern[$0 % colorPattern.count] } } var body: some View { HStack { ForEach(repeatedColors, id: \.self) { color in Rectangle() .foregroundColor(color) } } } }
额外可选优化
如果targetLength或colorPattern需要动态变化,只需把它们改成@State或@Binding,计算属性会自动响应变化,无需额外处理。也可以给[Color]扩展一个复用方法:
extension Array where Element == Color { func repeated(to length: Int) -> [Color] { guard !isEmpty else { return [] } return (0..<length).map { self[$0 % count] } } }
之后在计算属性里直接调用:colorPattern.repeated(to: targetLength)
内容的提问来源于stack exchange,提问作者Buble Dart
相关产品推荐
相关产品推荐

