如何在 NSUserDefaults Swift 2.3 中保存单例对象?

Posted

技术标签:

【中文标题】如何在 NSUserDefaults Swift 2.3 中保存单例对象?【英文标题】:How to save Singletone object in NSUserDefaults Swift2.3? 【发布时间】:2017-08-17 07:08:36 【问题描述】:
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.009 Fiyre[15749:1061631] *** NSForwarding: 警告:“Fiyre.AddBodyMeasurments”类的对象 0x7fca71d18700 没有实现 methodSignatureForSelector: -- 前面的麻烦 无法识别的选择器 -[Fiyre.AddBodyMeasurments 替换ObjectForKeyedArchiver:]

谢谢提前。

【问题讨论】:

***.com/questions/37980432/… 谢谢,但我必须存储单例对象 【参考方案1】:

错误消息显示该类不是从NSObject 继承的。

NSObject 继承必须符合NSCoding。 归档自定义类需要NSCoding

【讨论】:

【参考方案2】:

实际上,您保存的不是单例对象,而是一般的对象。反序列化对象后(从 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
    

【讨论】:

以上是关于如何在 NSUserDefaults Swift 2.3 中保存单例对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中保存NSUserDefaults中的颜色?

如何使用 NSUserDefaults 在 Swift 中存储自定义类数组?

如何在 NSUserDefaults Swift 2.3 中保存单例对象?

杀死/退出应用程序后,如何在 UITableView 中使用 NSUserDefaults 显示自定义单元格,Xcode Swift

Swift 将图像(截图)保存到 nsuserdefaults

静态类型的 NSUserDefaults