一尘不染

如何在Swift中归档和取消归档自定义对象?或者如何在Swift中将自定义对象保存到NSUserDefaults?

swift

我有一堂课

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

我做错了什么?


阅读 376

收藏
2020-07-07

共1个答案

一尘不染

NSKeyedArchiver仅适用于Objective-
C类,不适用于纯Swift类。您可以通过使用@objc属性标记类或从诸如的Objective-C类继承来将类桥接到Objective-C
NSObject

有关更多信息,请参见结合使用Swift和Cocoa和Objective-C

2020-07-07