如何在NSUserDefaults Swift2.3中保存Singletone对象?

时间:2017-08-17 07:08:37

标签: swift userdefaults

class AddBodyMeasurments
{
    static let sharedInstance = AddBodyMeasurments()
    var BodyMeasurements:AddMeasurment!

    private init()
    {
        BodyMeasurements = AddMeasurment.init(json: [:])
    }
    func SaveValue(value:AddMeasurment)
    {
        BodyMeasurements = value
    }
}

我尝试了以下内容:

let data = NSKeyedArchiver.archivedDataWithRootObject(obj)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "folks")

我收到以下错误:

  

2017-08-17 12:37:46.0​​09 Fiyre [15749:1061631] *** NSForwarding:   警告:'Fiyre.AddBodyMeasurments'类的对象0x7fca71d18700   没有实现methodSignatureForSelector: - 提前麻烦   无法识别的选择器 - [Fiyre.AddBodyMeasurments   replacementObjectForKeyedArchiver:]

谢谢你。

2 个答案:

答案 0 :(得分:1)

错误消息显示该类未从NSObject继承。

  • 需要NSObject的继承才能符合NSCoding
  • 归档自定义类需要
  • NSCoding

答案 1 :(得分:0)

实际上,您一般不会保存单个对象,而是保存对象。在反序列化对象(从NSUserDefaults获取其实例)之后,您将该实例存储到您的单例对象中,或者更准确地说,您将使用反序列化对象实例化您的单例对象。

class AddBodyMeasurments
{
    static let sharedInstance = AddBodyMeasurments()
    var bodyMeasurements:AddMeasurment!

    private init()
    {
        // deserializing object of AddBodyMeasurments type from NSDefaults.
        let deserialized = getFromUserDefaults()

        self.bodyMeasurements = deserialized.bodyMeasurements
    }
}