I am completely lost. This code is intended to print a bunch of 1s, but it outputs 8! What am I missing if anything?
class Mocha {var i = 0}
let arr = Array.init(repeating: Mocha(), count: 8)
for var instance in arr {
instance.i += 1 //Variable 'instance' was never mutated; consider removing 'var' to make it constant. WHAT?
}
for i in arr { print(i.i) }
Why on earth this doesn't print 1?
sveinhal
(Svein Halvor Halvorsen)
2
Mocha is a class, with reference semantics. Your array has the same Mocha instance repeated eight times. In the initisliser of your array, you create a single Mocha instance and instructs the array to contain it eight times. Then, you iterate over your array, each time getting the same instance, and each time incrementing its i field, until it finally reaches the value of 8.
1 Like
sveinhal
(Svein Halvor Halvorsen)
3
You can solve the issue by either:
- Making
Mocha a struct, or
- Replacing your array construction with a simple loop or map that creates eight different
Mochas
Gosh
, so its basically
class Mocha {var i = 0}
let a = Mocha()
var arr : [Mocha] = []
for _ in 0..<8 { arr.append(a); a.i += 1 }
arr.forEach {print($0.i)}
Huh, lovely, thank you for pointing this out. I thought that I am was going out of my mind.
1 Like