我有一个粒子数组(一个结构),我正试图使用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)
}
编译器抱怨我试图用不可变的方式更新,这个粒子是一个
let
变量。我知道我可以使用particles = particles.map {(particle:Particle -> Particle in
var newParticle = particle
newParticle.updateStateWith(2)
return newParticle
}
但这感觉真的很笨拙。
map
版本清楚地表明,我希望在不创建新值(或整个新数组)的情况下更新数组中的某些值。顺便说一下,for
可以通过一个Particle
而不是class
(即,我使用一个引用数组),它仍然抱怨。 最佳答案
给出的例子确实有效。如果发布的代码是项目的完整代码,则可能会尝试清除项目。
通过回答标题中的问题,在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