Hi @Jumhyn may I ask a quesiton about the following example code in SE-0269? The code doesn't look correct to me. Since the method() method is non-mutating, the self implicitly passed to the cloure in it has to be immutable. If so, how could x += 1 work?
I tried the code in playground and the compiler did emit "Left side of mutating operator isn't mutable: 'self' is immutable" error. Is this a code "copy and paste" error in the proposal or am I missing something?
# The value type example in introduction section
struct Test {
var x = 0
func execute(_ work: @escaping () -> Void) {
work()
}
func method() {
execute {
x += 1
}
}
}
Looks like a copy and paste error to me. There's no way that self can be mutated inside the closure as-is. Escaping closures cannot modify a captured value type as the value is copied into the closure when it's captured.
The example needs to be changed to a read-only demonstration of the feature to compile.
struct Test {
var x = 0
func execute(_ work: @escaping () -> Void) {
work()
}
func method() {
execute {
print(x)
}
}
}
Yeah, this is just a drafting error. The "value type" rule was added in a later draft of the proposal and, as @bradleymackey suggests, a poorly-checked copy-paste led to this issue.