我有一个Particle(一个结构)数组,我试图使用for
语句更新。
struct Particle {
private var internalState = 0
mutating func updateStateWith(_ newState:Int) {
self.internalState = newState
}
}
var particles = [Particle]()
particles.append(Particle())
particles.append(Particle())
for var particle in particles {
particle.updateStateWith(2)
}
编译器抱怨我试图在immutable中更新,该粒子是let
变量。我知道我可以使用map
(我希望我能正确记住
particles = particles.map {(particle:Particle -> Particle in
var newParticle = particle
newParticle.updateStateWith(2)
return newParticle
}
但这感觉非常笨重。 for
版本明确表示我希望在不创建新值(或全新数组)的情况下更新数组中的某些值。顺便说一句Particle
可以class
而不是struct
(即我使用一系列参考文献),它仍然会抱怨。
答案 0 :(得分:4)
给出的例子确实有效。如果您发布的代码是项目的完整代码,则可以尝试清理项目。
通过回答标题中的问题,在for var particle in particles
循环之后(假设没有编译器错误),粒子将不会更新。
由于struct
是Swift中的值类型,因此循环中particle
的每个值都是粒子的副本,而不是对它的引用。您正在更新副本,但原始数组保持不变。
for var particle in particles {
particle.updateStateWith(2) // updates the copy of the particle
}
// `particles` remains unchanged
如果你真的想在for循环中更新struct
的数组,你可以这样做:
for i in particles.indices {
particles[i].updateStateWith(2) // updates actual array element
}
// `particles` has now been updated