Dia*_*git 6 initwithcoder swift
我是swift adn中的新手,我在swift中遇到initwithcoder的问题.
我有类UserItem,我需要它来保存用户登录.
在目标c中是这样的
- (id)initWithCoder:(NSCoder *)decoder{
if (self = [super init]){
self.username = [decoder decodeObjectForKey:@"username"];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
而且很快我就是这样想的
override init() {
super.init()
}
required init(coder decoder: NSCoder!) {
self.username = (decoder.decodeObjectForKey("username")?.stringValue)!
super.init(coder: decoder)
}
Run Code Online (Sandbox Code Playgroud)
但如果像上面那样,我得到代码错误
super.init(coder: decoder)
Run Code Online (Sandbox Code Playgroud)
错误消息是"额外参数'编码器'在通话中
我不知道了,所以我试试这个代码,
convenience init(decoder: NSCoder) {
self.init()
self.username = (decoder.decodeObjectForKey("username")?.stringValue)!
}
Run Code Online (Sandbox Code Playgroud)
但是,得到错误
.UserItem initWithCoder:]: unrecognized selector sent to instance 0x7fd4714ce010
Run Code Online (Sandbox Code Playgroud)
我该怎么办?谢谢你的帮助.
Cod*_*ent 12
我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)
Run Code Online (Sandbox Code Playgroud)
重要的是匹配encodeWithCoder(aCoder:)(归档函数)和init(coder:)(归档函数)中的键和数据类型.
对于初学者来说,令人困惑的地方是如何处理超类.如果超类本身符合,则应该只在上面的两个函数中包含超类NSCoding.NSObject本身不提供.这个想法是每个类都知道它自己的属性,其中一些是私有的.如果超类无法归档/取消归档,则无需调用它们.
| 归档时间: |
|
| 查看次数: |
13872 次 |
| 最近记录: |