Невозможно установить объект, не относящийся к списку свойств, в UserDefaults

У меня есть простая функция, в которой я сохраняю объект по умолчанию, чтобы загрузить его позже, это выглядит так:

func saveGame() {

    // hero is an instance of the class Hero, subclassed from SKSpriteNode
    UserDefaults.standard.set(hero, forKey: HeroObjectKey)
}

Я получаю сообщение об ошибке:

2017-03-13 21: 15: 33.124271 Castle [5405: 5208658] [Пользовательские значения по умолчанию] Попытка установить имя объекта, не относящегося к списку свойств: текстура 'hero': ['hero1.ico' (32 x 32)] позиция : {0, 0} масштаб: {1,00, 1,00} размер: {32, 32} привязка: {0,5, 0,5} поворот: 0,00 как значение NSUserDefaults / CFPreferences для ключа heroObjectKey

Это потому, что я не могу сохранить свои собственные пользовательские объекты, или мне не нравится какое-то значение свойства внутри объекта?

Примечание: есть очень похожий вопрос, который частично решил мою проблему, но принятый ответ не сработал для меня из-за различий между Swift3 и тем, что они использовали. Итак, я дам ответ здесь.


person zeeple    schedule 14.03.2017    source источник
comment
Возможный дубликат Сохранение пользовательского класса SWIFT с NSCoding в UserDefaults   -  person Alexander    schedule 14.03.2017
comment
Спасибо @Alexander, так как случилось, что этот вопрос меня сблизил, но там есть синтаксические проблемы с ответами, поэтому я публикую свой ответ здесь.   -  person zeeple    schedule 14.03.2017


Ответы (1)


Ответ заключался в использовании keyedArchiver для преобразования объекта в объект NSData. Вот код Swift 3 для хранения и извлечения объекта:

func saveGame() {
    UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: hero), forKey: HeroObjectKey)
}

func defaultExistsForGameData() -> Bool {

    var gameData = false

    if let heroObject = UserDefaults.standard.value(forKey: HeroObjectKey) as? NSData {
        hero = NSKeyedUnarchiver.unarchiveObject(with: heroObject as Data) as! Hero
        gameData = true
    }

    return gameData
}
person zeeple    schedule 14.03.2017
comment
это gameData действительно отрывочно. Просто return true или return false. - person Alexander; 14.03.2017
comment
не работает. Ошибка: encodeWithCoder:]: unrecognized selector sent to instance - person Vyachaslav Gerchicov; 28.11.2017
comment
keyedArchiver, должно быть, изменился с марта прошлого года. Я взгляну. - person zeeple; 07.04.2018