迭代时“不能对不可变值使用变异 getter:'self' 是不可变的”?

'Cannot use mutating getter on immutable value: 'self' is immutable' when iterating?

有谁知道为什么 ForEach 中的 self.indexCount 给出错误 Cannot use mutating getter on immutable value: 'self' is immutable 错误?我可以提供aViewindexCount,但不是很方便。我不会更改 indexCount。这是 SwiftUI 错误还是故意的?

struct aView: View {
    let array: [[String]]
    lazy var indexCount: Int = array[0].count

    var body: some View {
        VStack {
            ForEach(0..<self.indexCount, id: \.self) { index in
                Text("Hello World")
           }
        }
    }
}

lazy 在初始化值时总是会导致突变。因此,您不能在非可变上下文中使用它。

body 不是 mutating 所以你不能在那里使用 lazy。这个最小的例子你会得到同样的错误:

struct LazyUser {
    lazy var something: Bool = { false } ()
}

func useSomething() {
    let notOk = LazyUser()
    var ok = LazyUser()
    _ = notOk.something // ERROR: Cannot use mutating getter on immutable value: 'notOk' is a 'let' constant
    _ = ok.something
}

有一个关于此的话题 on the Swift Forums

这是故意的。在 SwiftUI 中,只有 @State 个变量可以更改。你不能像那样使用 lazy var 。将其替换为计算 属性:

var indexCount : Int { array[0].count }

无论如何都更好,因为它始终是正确的:indexCount 将始终是 array[0] 当前 大小),而 你的方式,无论count第一次获取它的时间,值都会冻结。