Это странное поведение, поскольку я считаю, что логика законна.
По сути, у меня есть массив объектов 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)
}
Нет никакого другого кода, который бы изменял свойства за пределами того, что я опубликовал. Это проблема с потоками? Есть ли что-то другое, что я должен делать?
Надеюсь, я слишком долго смотрел на это, и кто-то укажет на очевидное!
В коде вашего вопроса все еще есть 6 ошибок. Сделайте так, чтобы людям было проще помогать и публиковать действительный, проверяемый код.





Я думаю, что эта строка может вызвать проблему:
players.[index] = player
После того, как вы установите для свойства isActive значение true, вы назначаете объект, в котором для isActive все еще установлено значение false, обратно в массив. Это связано с характером циклов for в Swift. Вы изменяете не исходный элемент в массиве, а его копировать.
Рассмотрите возможность использования этого цикла for (непроверенного):
for index in 0..<players.count {
players[index].isActive = true
}
Похоже, вы на правильном пути, хотя я получаю тот же результат. Даже клонировал объект и вставлял его по индексу. Проходя через точки останова, все верные значения сохраняются, пока я не перейду к методу savePlayers - старые значения вернулись. Настройка игровой площадки на действительно простом примере работает, как и ожидалось. Это говорит мне о том, что в моем коде происходит еще что-то, что мне нужно исследовать. Спасибо за ваше предложение.
Пожалуйста, разместите код, который действительно компилируется. В коде вашего вопроса много ошибок.