Cannot use mutating getter on immutable value: 'self' is immutable error
Solution 1:
Because when you call x
inside the struct, it's not clear whether the contentView
itself is mutable or not. A value type gets mutable only when it is defined as a var
.
So it would help if you wrapped it with an immutable value before using it inside a builder function inside the struct.
like this:
func xValue() -> Double {
var mutatableSelf = self
return mutatableSelf.x
}
var body: some View {
VStack {
Text("\(xValue())")
}
}
💡Note: Lazy
property's value will be associated on the first call and this mutates the object. So they are considered as mutating
Solution 2:
This has nothing to do with SwiftUI
. It's about a design Swift is enforcing with its getters. The principle is:
The getters should not mutate the object. Because developers may not be expecting that. They should only expect a change when you're using the setter or calling a mutating function. A getter is neither of them.
The following example works as expected:
struct Device {
var isOn = true
}
let x = Device()
let y = Device()
y.isOn // Doing such will not cause the object to mutate.
Yet the following example, the getter will have a side-effect. The Swift architecture just doesn't allow it.
struct Device2 {
var x = 3
var isOn: Bool {
x = 5
return true
}
}
let a = Device2()
let b = Device2()
a.isOn // Doing such will mutate the object. a.x will be '5'. While `b.x` will be '3'. Swift doesn't want to allow this.