ios - Swift - 在 NSArchiving 数组之前重置突变属性

标签 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)
}

除了我发布的内容之外,没有任何其他代码会改变属性。是线程问题吗?我应该做一些不同的事情吗?

希望我已经盯着这个问题太久了,有人会指出显而易见的事情!

最佳答案

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

players.[index] = player

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

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

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

关于ios - Swift - 在 NSArchiving 数组之前重置突变属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49211213/

相关文章:

ios - 按索引移动数组中的元素

c - 通过指针传递二维数组

objective-c - 在 UITableView 中插入新行的技术

ios - React-native 独立应用程序在杀死端口 8081 后崩溃

ios - 在嵌套的 NSManagedObjectContext 中缓慢删除和保存

c# - NewtonSoft JsonConvert 列表

swift - iOS 13,呈现的 UIActivityViewController 中的自定义图像、标题和副标题

ios - subview 未添加某些 UICollectionViewCells 并闪烁(以编程方式)

ios - Swift 从核心数据获取图像到 TableView

arrays - 使用解码到通用接口(interface)时如何验证 JSON?