Как кодировать initwithcoder в Swift?
Я новичок в быстром и у меня проблемы с initwithcoder в быстром.
У меня есть класс UserItem, мне нужно, чтобы сохранить логин пользователя.
в цели с так
- (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
что я должен делать? прежде чем спасибо за вашу помощь.
1 ответ
Я боролся с 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(aCoder:)
(функция архива) и init(coder:)
(разархивировать функцию).
Где смущает новичков, что делать с суперклассом. Вы должны включать суперкласс в две функции выше, только если сам суперкласс соответствует NSCoding
, NSObject
не обеспечивает это само по себе. Идея состоит в том, что каждый класс знает о своих собственных свойствах, некоторые из которых являются частными. Если суперкласс не может архивировать / разархивировать, нет необходимости вызывать их.