无法在UserDefaults中设置非属性列表对象。

9

我有一个简单的函数,用于将一个对象保存到用户默认设置中,以便稍后加载它,函数如下:

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] [用户默认设置] 尝试将非属性列表对象 name:'hero' texture:[ 'hero1.ico' (32 x 32)] position:{0, 0} scale:{1.00, 1.00} size:{32, 32} anchor:{0.5, 0.5} rotation:0.00 作为NSUserDefaults/CFPreferences值保存到键heroObjectKey中。
这是因为我不能保存自定义对象,还是因为对象内的某些属性值不被接受?
注:有一个非常相似的问题部分解决了我的问题,但那里的被接受答案对我没有用,因为Swift3和他们使用的东西之间存在差异。所以我会在这里提供答案。

谢谢@Alexander,恰好那个问题让我接近答案,但是那里的答案存在语法问题,所以我在这里发布我的答案。 - zeeple
1个回答

16

使用 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
}

1
那个 gameData 真的很可疑。只需 return truereturn false - Alexander
8
无法运行。错误:encodeWithCoder::向实例发送未被识别的选择器。 - Vyachaslav Gerchicov
keyedArchiver 自去年三月以来可能已经发生了变化。我会去查一下。 - zeeple

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接