我有一个粒子(一个结构)数组,我试图使用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
(即我使用一系列参考文献),它仍然抱怨。
给出的例子确实有效。如果您发布的代码是项目的完整代码,则可以尝试清理项目。
通过回答标题中的问题,在你的for var particle in particles
循环之后(假设没有编译器错误),粒子将不会被更新。
由于struct
s是Swift中的值类型,因此循环中particle
的每个值都是粒子的副本,而不是对它的引用。您正在更新副本,但原始阵列保持不变。
for var particle in particles {
particle.updateStateWith(2) // updates the copy of the particle
}
// `particles` remains unchanged
如果你真的想在for循环中更新struct
s数组,你可以这样做:
for i in particles.indices {
particles[i].updateStateWith(2) // updates actual array element
}
// `particles` has now been updated