迭代时“不能对不可变值使用变异 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
错误?我可以提供aView
和indexCount
,但不是很方便。我不会更改 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
是第一次获取它的时间,值都会冻结。
有谁知道为什么 ForEach
中的 self.indexCount
给出错误 Cannot use mutating getter on immutable value: 'self' is immutable
错误?我可以提供aView
和indexCount
,但不是很方便。我不会更改 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
是第一次获取它的时间,值都会冻结。