web-dev-qa-db-ja.com

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' texture:['hero1.ico'(32 x 32)]位置:{0、0}スケール:{1.00、1.00}サイズ:{32、32}アンカー:{0.5、0.5}回転:0.00キーheroObjectKeyのNSUserDefaults/CFPreferences値として

これは、自分のカスタムオブジェクトを保存できないか、オブジェクト内の一部のプロパティ値が好きではないためですか?

注:私の問題を部分的に解決した非常に類似した質問がありますが、Swift3と彼らが使用しているものの違いにより、受け入れられた回答は私にとってうまくいきませんでした。だから私はここで答えを提供します。

9
zeeple

答えは、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
}
16
zeeple