如何在Swift中使用编码器对init进行编码?

如何在Swift中使用编码器对init进行编码?,swift,initwithcoder,Swift,Initwithcoder,我是swift的新手,我对swift中的initwithcoder有问题 我有类UserItem,我需要它来保存用户登录 在目标c中是这样的 - (id)initWithCoder:(NSCoder *)decoder{ if (self = [super init]){ self.username = [decoder decodeObjectForKey:@"username"]; } return self; } override init()

我是swift的新手,我对swift中的initwithcoder有问题

我有类UserItem,我需要它来保存用户登录

在目标c中是这样的

 - (id)initWithCoder:(NSCoder *)decoder{
    if (self = [super init]){
        self.username = [decoder decodeObjectForKey:@"username"];
    }
    return self;
}
override init() {
   super.init()
}    

required init(coder decoder: NSCoder!) {

   self.username = (decoder.decodeObjectForKey("username")?.stringValue)!

   super.init(coder: decoder)
}
在斯威夫特,我试着这样做

 - (id)initWithCoder:(NSCoder *)decoder{
    if (self = [super init]){
        self.username = [decoder decodeObjectForKey:@"username"];
    }
    return self;
}
override init() {
   super.init()
}    

required init(coder decoder: NSCoder!) {

   self.username = (decoder.decodeObjectForKey("username")?.stringValue)!

   super.init(coder: decoder)
}
但如果像上面那样,我会在代码上出错

super.init(coder: decoder)
错误消息是调用中的“额外参数‘编码器’”

我想不出来了,所以我想试试这个代码

convenience init(decoder: NSCoder) {
   self.init()

   self.username = (decoder.decodeObjectForKey("username")?.stringValue)!
}
但是,得到错误

.UserItem initWithCoder:]: unrecognized selector sent to instance 0x7fd4714ce010

我该怎么办?谢谢你的帮助。

我过去一直在为
NSCoding
(用于归档和非归档对象的协议)而挣扎,我看到你也在经历同样的痛苦。希望这能减轻一点:

class UserItem: NSObject, NSCoding {
    var username: String
    var anInt: Int

    init(username: String, anInt: Int) {
        self.username = username
        self.anInt = anInt
    }

    required init?(coder aDecoder: NSCoder) {
        // super.init(coder:) is optional, see notes below
        self.username = aDecoder.decodeObjectForKey("username") as! String
        self.anInt = aDecoder.decodeIntegerForKey("anInt")
    }

    func encodeWithCoder(aCoder: NSCoder) {
        // super.encodeWithCoder(aCoder) is optional, see notes below
        aCoder.encodeObject(self.username, forKey: "username")
        aCoder.encodeInteger(self.anInt, forKey: "anInt")
    }

    // Provide some debug info
    override var description: String {
        get {
            return ("\(self.username), \(self.anInt)")
        }
    }
}

// Original object
let a = UserItem(username: "michael", anInt: 42)

// Serialized data
let data = NSKeyedArchiver.archivedDataWithRootObject(a)

// Unarchived from data
let b = NSKeyedUnarchiver.unarchiveObjectWithData(data)!

print(a)
print(b)
重要的是要匹配
encodeWithCoder(acorder:)
(存档函数)和
init(coder:)
(非存档函数)中的键和数据类型


对于初学者来说,最让人困惑的是如何处理超类。如果超类本身符合
NSCoding
NSObject
本身不提供超类,则应仅在上述两个函数中包含超类。其思想是每个类都知道自己的属性,其中一些属性是私有的。如果ss无法存档/取消存档,无需调用它们。

“让类UserItem”显示其声明,请。如何从Nib文件调用基本/抽象UIViewController?我有一个类似的代码,但在我的情况下,编译器要求我将“便利性”添加到
必需的init?(coder aDecoder:NSCoder)
。这阻止了我调用super。(init:coder)。我错过了什么吗?你不应该叫“super.init()”?