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.
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
}