如何在Swift中编写initwithcoder代码?

如何在Swift中编写initwithcoder代码?,第1张

概述我是swift adn中的新手,我在swift中遇到initwithcoder的问题. 我有类UserItem,我需要它来保存用户登录. 在客观c中是这样的 - (id)initWithCoder:(NSCoder *)decoder{ if (self = [super init]){ self.username = [decoder decodeObjectForKey 我是swift adn中的新手,我在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)}

但如果像上面那样,我会得到代码错误

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 objectlet a = UserItem(username: "michael",anInt: 42)// Serialized datalet data = NSKeyedArchiver.archivedDataWithRootObject(a)// Unarchived from datalet b = NSKeyedUnarchiver.unarchiveObjectWithData(data)!print(a)print(b)

重要的是匹配encodeWithCoder(aCoder :)(归档函数)和init(编码器:)(unarchive函数)中的键和数据类型.

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

总结

以上是内存溢出为你收集整理的如何在Swift中编写initwithcoder代码?全部内容,希望文章能够帮你解决如何在Swift中编写initwithcoder代码?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1051318.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存