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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:15:36