【问题标题】:'Cannot use mutating getter on immutable value: 'self' is immutable' when iterating?'不能在不可变值上使用变异getter:'self'是不可变的'迭代时?
【发布时间】:2020-07-01 04:05:17
【问题描述】:

有谁知道为什么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")
           }
        }
    }
}

【问题讨论】:

    标签: ios swift swiftui swift5


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      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的帖子。

      【讨论】:

        猜你喜欢
        • 2020-07-27
        • 2019-12-10
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 2023-01-10
        相关资源
        最近更新 更多