如何在Swift中更新数组中包含的值?

问题描述 投票:0回答:1

我有一个粒子(一个结构)数组,我试图使用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(即我使用一系列参考文献),它仍然抱怨。

arrays swift
1个回答
4
投票

给出的例子确实有效。如果您发布的代码是项目的完整代码,则可以尝试清理项目。

通过回答标题中的问题,在你的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
© www.soinside.com 2019 - 2024. All rights reserved.