Swift - 在NSArchiving数组之前重置Mutated属性

时间:2018-03-10 16:09:51

标签: ios arrays swift

这种奇怪的行为,因为我认为逻辑是合法的。

基本上,我有一个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)
}

除了我发布的内容之外,没有任何其他代码可以改变属性。这是一个线程问题吗?我应该做些什么吗?

希望我一直盯着这个太长时间,有人会指出显而易见的事情!

1 个答案:

答案 0 :(得分:0)

我认为这一行可能会导致问题:

players.[index] = player

isActive属性设置为true后,将isActive仍设置为false的对象分配回数组。这是由于Swift中for循环的本质。您不是修改数组中的原始项目,而是修改它的副本

考虑使用for for循环(未经测试):

for index in 0..<players.count {
    players[index].isActive = true
}