後でロードするためにオブジェクトをユーザーデフォルトに保存する単純な関数があります。これは次のようになります。
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' texture:['hero1.ico'(32 x 32)]位置:{0、0}スケール:{1.00、1.00}サイズ:{32、32}アンカー:{0.5、0.5}回転:0.00キーheroObjectKeyのNSUserDefaults/CFPreferences値として
これは、自分のカスタムオブジェクトを保存できないか、オブジェクト内の一部のプロパティ値が好きではないためですか?
注:私の問題を部分的に解決した非常に類似した質問がありますが、Swift3と彼らが使用しているものの違いにより、受け入れられた回答は私にとってうまくいきませんでした。だから私はここで答えを提供します。
答えは、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
}