我有一个粒子数组(一个结构),我正试图使用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循环之后(假设没有编译器错误),粒子将不会被更新。
因为structs是Swift中的值类型,所以循环中particle的每个值都是粒子的副本,而不是对它的引用。您正在更新副本,但原始数组保持不变。

for var particle in particles {
    particle.updateStateWith(2) // updates the copy of the particle
}
// `particles` remains unchanged

如果您真的想在for循环中更新structs的数组,可以这样做:
for i in particles.indices {
    particles[i].updateStateWith(2) // updates actual array element
}
// `particles` has now been updated

09-17 00:53
查看更多