我有一堂课
class Player { var name = "" func encodeWithCoder(encoder: NSCoder) { encoder.encodeObject(name) } func initWithCoder(decoder: NSCoder) -> Player { self.name = decoder.decodeObjectForKey("name") as String return self } init(coder aDecoder: NSCoder!) { self.name = aDecoder.decodeObjectForKey("name") as String } init(name: String) { self.name = name } }
我想序列化并保存为用户默认值。
首先,我不确定如何正确编写编码器和解码器。因此,对于初始化,我编写了两种方法。
当我尝试执行此代码时:
func saveUserData() { let player1 = Player(name: "player1") let myEncodedObject = NSKeyedArchiver.archivedDataWithRootObject(player1) NSUserDefaults.standardUserDefaults().setObject(myEncodedObject, forKey: "player") }
应用程序崩溃,我收到此消息:
*** NSForwarding: warning: object 0xebf0000 of class '_TtC6GameOn6Player' does not implement methodSignatureForSelector: -- trouble ahead
我做错了什么?
NSKeyedArchiver仅适用于Objective- C类,不适用于纯Swift类。您可以通过使用@objc属性标记类或从诸如的Objective-C类继承来将类桥接到Objective-C NSObject。
NSKeyedArchiver
@objc
NSObject
有关更多信息,请参见结合使用Swift和Cocoa和Objective-C。