web-dev-qa-db-fra.com

Impossible de définir un objet sans liste de propriétés dans UserDefaults

J'ai une fonction simple dans laquelle j'enregistre un objet dans les valeurs par défaut de l'utilisateur afin de le charger plus tard, il ressemble à ceci:

func saveGame() {

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

Je reçois l'erreur:

13-03-2017 21: 15: 33.124271 Château [5405: 5208658] [Valeurs par défaut de l'utilisateur] Tentative de définition d'un nom d'objet ne figurant pas dans la liste des propriétés: texture "hero": position "[hero1.ico" (32 x 32)] : {0, 0} échelle: {1,00, 1,00} taille: {32, 32} ancre: {0,5, 0,5} rotation: 0,00 comme valeur NSUserDefaults/CFPreferences pour la clé heroObjectKey

Est-ce parce que je ne peux pas enregistrer mes propres objets personnalisés ou n'aime-t-il pas une valeur de propriété dans l'objet?

Remarque: il y a une question très similaire qui a partiellement résolu mon problème, mais la réponse acceptée n'a pas fonctionné pour moi en raison des différences entre Swift3 et tout ce qu'ils utilisaient. Je vais donc fournir la réponse ici.

9
zeeple

La réponse a été d'utiliser keyedArchiver pour convertir l'objet en un objet NSData. Voici le code Swift 3 pour stocker et récupérer l'objet:

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
}
16
zeeple