我是swift adn中的新手,我在swift中遇到initwithcoder的问题.
在客观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(你用来存档和取消归档对象的协议),我看到你正在经历同样的痛苦.希望这会减少一点:
原文链接:https://www.f2er.com/swift/320191.htmlclass 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(aCoder :)(归档函数)和init(编码器:)(unarchive函数)中的键和数据类型.
对于初学者来说,令人困惑的地方是如何处理超类.如果超类本身符合NSCoding,则只应在上述两个函数中包含超类. NSObject本身不提供.这个想法是每个类都知道它自己的属性,其中一些是私有的.如果超类无法归档/取消归档,则无需调用它们.