Чтобы использовать NSKeyedArchiver
, вы делаете свой объект соответствующим NSCoding
. И если у вас есть кортежи, вы можете кодировать/декодировать элементы отдельно:
class MyObject: NSObject, NSCoding {
var id: Int
var size: (Float, Float)
init(id: Int, size: (Float, Float)) {
self.id = id
self.size = size
super.init()
}
required init?(coder aDecoder: NSCoder) {
guard let id = aDecoder.decodeObjectForKey("id") as? Int else { return nil }
guard let size0 = aDecoder.decodeObjectForKey("size.0") as? Float else { return nil }
guard let size1 = aDecoder.decodeObjectForKey("size.1") as? Float else { return nil }
self.id = id
self.size = (size0, size1)
super.init()
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(id, forKey: "id")
aCoder.encodeObject(size.0, forKey: "size.0")
aCoder.encodeObject(size.1, forKey: "size.1")
}
}
Вы упоминаете массивы, так что я не уверен, что если вы говорите о массиве пользовательских объектов, но теперь, когда ваш объект соответствует NSCoding
, теперь вы можете без проблем архивировать и распаковывать массивы этих объектов.
Точно так же, если у вас есть какой-то другой объект, который имеет MyObject
свойство, вы можете применить NSCoding
на этот вопрос, и он может воспользоваться тем, что MyObject
уже соответствует NSCoding
:
class ParentObject: NSObject, NSCoding {
var name: String
var value: Int
var child: MyObject
init(name: String, value: Int, child: MyObject) {
self.name = name
self.value = value
self.child = child
super.init()
}
required init?(coder aDecoder: NSCoder) {
name = aDecoder.decodeObjectForKey("name") as! String
value = aDecoder.decodeObjectForKey("value") as! Int
child = aDecoder.decodeObjectForKey("child") as! MyObject
super.init()
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(name, forKey: "name")
aCoder.encodeObject(value, forKey: "value")
aCoder.encodeObject(child, forKey: "child")
}
}
ISN 't массив для размеров или 'NSStringFromSize()' соответственно вариант? – vadian
Вам нужно сделать соответствие класса 'NSCoding'. И когда вы это делаете, вы сами кодируете/декодируете кортежи (как отдельные значения, как строку, как пользовательский тип, который сам соответствует «NSCoding» и т. Д.). Как сделать соответствие класса «NSCoding» описано в [Руководстве по программированию и сериализации] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Archiving/Archiving.html). – Rob
@Rob, я написал класс NSCoding, и я сделал все как хранение и извлечение. Я хочу знать, как разделить в этом. или я могу добавить целую часть к одному массиву и кодировать/декодировать, вы можете предложить это – kumar