这种奇怪的行为,因为我认为逻辑是合法的。
基本上,我有一个Player对象数组。我调用一个函数将每个对象的isActive
属性设置为true
并替换数组中的对象。然后我调用savePlayers
将我更新的对象数组存档到磁盘,但我设置的属性似乎重置为false
。
Swift 4
Xcode 9.2
iOS 11.0
以下是相关代码:
var players = [Player]()
func activatePlayers() {
for (index, player) in players.enumerated() {
player.isActive = true
players[index] = player
}
// just as a test, see if property is there/updated
for(_, player) in players.enumerated() {
print("\(player.name): \(player.isActive)") // prints “chris: true”
}
savePlayers()
}
func savePlayers()
{
// just a test to see if property is mutated
for(_, player) in players.enumerated() {
print("\(player.name): \(player.isActive)") // prints “chris: false”
}
NSKeyedArchiver.archiveRootObject(players, toFile: Player.archiveURL.path)
}
除了我发布的内容之外,没有任何其他代码可以改变属性。这是一个线程问题吗?我应该做些什么吗?
希望我一直盯着这个太长时间,有人会指出显而易见的事情!
答案 0 :(得分:0)
我认为这一行可能会导致问题:
players.[index] = player
将isActive
属性设置为true
后,将isActive
仍设置为false
的对象分配回数组。这是由于Swift中for循环的本质。您不是修改数组中的原始项目,而是修改它的副本。
考虑使用for for循环(未经测试):
for index in 0..<players.count {
players[index].isActive = true
}