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

Arrays 如何在Swift中更新数组中包含的值?,arrays,swift,Arrays,Swift,我有一个粒子数组(一个结构),我正试图使用for语句更新它 struct Particle { private var internalState = 0 mutating func updateStateWith(_ newState:Int) { self.internalState = newState } } var particles = [Particle]() particles.append(Particle()) particles.a

我有一个粒子数组(一个结构),我正试图使用
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
变量。我知道我可以使用
map
by(我希望我记得正确)

particles = particles.map {(particle:Particle -> Particle in
    var newParticle = particle
    newParticle.updateStateWith(2)
    return newParticle
}

但是这感觉真的很笨拙。版本的
明确表示我希望更新数组中的一些值,而不创建新值(或一个全新的数组)。顺便说一下,
粒子可以通过
而不是
结构
(即,我使用一个引用数组),它仍然抱怨。

给出的示例确实有效。如果您发布的代码是项目中的完整代码,您可能会尝试清理项目

通过回答标题中的问题,在粒子中变量粒子的
循环之后(假设没有编译器错误),粒子将不会更新

由于
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

给出的示例确实有效。如果您发布的代码是项目中的完整代码,您可能会尝试清理项目

通过回答标题中的问题,在粒子中变量粒子的
循环之后(假设没有编译器错误),粒子将不会更新

由于
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


您发布的代码在Xcode 9.2 PlayPlayed中没有生成编译器错误。我没有尝试PlayPlayed,但9.2不喜欢它(形式稍微复杂一些,但仍然)在代码中。让我看看……如果你想调用一个变异函数,你的结构变量需要声明为var not Let。这是因为当你调用一个变异函数时,会创建一个新的结构并分配给var。好的,Mike,你是对的,它不会在操场上抱怨,但实际上不会更新值(编辑了我的代码,以便
粒子
数组实际包含某些内容).internalState仍然是0,而不是2。因此,我展示了我的非Swiftian期望值。此外,结构变量声明为var的位置在哪里?代码中的所有内容不是var,而是let吗?请参阅@Helam的答案。您发布的代码在Xcode 9.2 PlayPlay中不会生成编译器错误。嗯,我没有尝试PlayPlayPlay,但9.2不喜欢它(以稍微复杂的形式,但仍然)在代码中。让我看看……如果你想调用一个变异函数,你的结构变量需要声明为var not Let。这是因为当你调用一个变异函数时,会创建一个新的结构并分配给var。好的,Mike,你是对的,它不会在操场上抱怨,但实际上不会更新值(编辑了我的代码,以便
粒子
数组实际包含某些内容).internalState仍然是0,而不是2。因此,我展示了我的非斯威夫特期望值。此外,结构变量声明为var的位置在哪里?代码中的所有内容不是var,而是let吗?请参见@Helam的答案。
对于粒子中的I。对于0中的I,索引
是一种更好的方法。。对。我忘记了。但是如果我用类替换结构(并去掉不需要的
变异
,那么它应该可以工作,因为数组是引用之一。在操场上检查现在给出了正确的行为,尽管在我的代码中编译器仍然抱怨。@RickShafer我猜你提到的
稍微复杂一点的形式
中有某种东西导致了编译器错误。@Helam:谢谢,虽然稍微复杂一点的形式实际上只是内部状态中的变量更多,更新也更复杂。但我感谢你及时的回答,因为这解决了我的困难。
对于粒子中的I。索引对于0中的I来说是一种更好的
方法。对。我忘记了。但是如果我在结构中添加类(并去掉不需要的
变异
,那么它应该可以工作,因为数组是引用之一。在操场上检查现在给出了正确的行为,尽管在我的代码中编译器仍然抱怨。@RickShafer我猜你提到的
稍微复杂一点的形式
中有某种东西导致了编译器错误。@Helam:谢谢,虽然稍微复杂一点的表单实际上只是内部状态中的变量更多,更新也相对更复杂。但是我感谢你及时的回答,因为这解决了我的困难。