如何使用NSCoding对通过委托传递的值进行编码

我真的很新,使用NSCodingfunction,我试图创build一个归档string的数据的持久性,特别是通过委托传递的UIColor。 我还没有find一个教程,编码的值没有声明和初始化在NSCoding协议符合相同的类。

我有下面的代码,这是符合我创build的协议的方法,并将传递的颜色值作为属性赋值给attributesString。

func didSelectColorCell(color: UIColor) { let coder = NSCoder.init() color.encode(with: coder) noteTextView.setAttributedValueAtSelectedTextRange(NSForegroundColorAttributeName, value: color) } 

该应用程序崩溃,并发送给我一个警告:“不能被发送到类NSCoder的抽象对象:创build一个具体的实例! 我真的迷失在如何进行。 我不知道如何使这个教程http://nshipster.com/nscoding/适应我的情况。

有人可以给我提供指导如何订购我的想法,或NSCoding如何与代表工作? 任何帮助,将不胜感激 :)

定义一个类来实现NSCoding协议(Playground示例):

 class ColorHelper: NSObject, NSCoding { var color: UIColor? init(color: UIColor) { super.init() self.color = color } required init(coder aDecoder: NSCoder) { if let color = aDecoder.decodeObject(forKey: "color") as? UIColor { self.color = color } } func encode(with aCoder: NSCoder) { aCoder.encode(color, forKey: "color") } func save(defaults key: String) -> Bool { let defaults = UserDefaults.standard let savedData = NSKeyedArchiver.archivedData(withRootObject: data) defaults.set(savedData, forKey: key) return defaults.synchronize() } convenience init?(defaults key: String) { let defaults = UserDefaults.standard if let data = defaults.object(forKey: key) as? Data, let obj = NSKeyedUnarchiver.unarchiveObject(with: data) as? ColorHelper, let color = obj.color { self.init(color: color) } else { return nil } } } let data = ColorHelper(color: .red) let savedData = NSKeyedArchiver.archivedData(withRootObject: data) let obj = NSKeyedUnarchiver.unarchiveObject(with: savedData) as? ColorHelper obj?.color 

在你的代码中:

 func didSelectColorCell(color: UIColor) { let helper = ColorHelper(color: color) helper.save(defaults: "color") noteTextView.setAttributedValueAtSelectedTextRange(NSForegroundColorAttributeName, value: color) } 

要读取保存的数据:

 let color = ColorHelper(defaults: "color")?.color