Um NSKeyedArchiver
zu verwenden, machen Sie Ihr Objekt konform zu NSCoding
. Und wenn Sie Tupel haben, können Sie die Elemente separat kodieren/dekodieren:
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")
}
}
Sie Arrays erwähnen, also bin ich nicht sicher, ob Sie über ein Array der benutzerdefinierten Objekte sprechen, aber jetzt, dass Ihr Objekt konform zu NSCoding
, können Sie nun Arrays dieser Objekte ohne weiteren Aufwand archivieren und entpacken.
Ebenso, wenn Sie ein anderes Objekt haben, die eine MyObject
Eigenschaft hat, können Sie NSCoding
auf das anwenden, und es können die Vorteile aus der Tatsache ziehen, dass MyObject
bereits entspricht 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 ein Array für die Größen oder 'NSStringFromSize()' bzw. eine Option? – vadian
Sie müssen Ihre Klasse an "NSCoding" anpassen. Und wenn Sie das tun, würden Sie die Tupel selbst codieren/dekodieren (als separate Werte, als String, als benutzerdefinierten Typ, der selbst mit "NSCoding" übereinstimmt, usw.). Wie man eine Klasse mit "NSCoding" konform macht, ist im [Archives and Serializations Programming Guide] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Archiving/Archiving.html) beschrieben. – Rob
@Rob, ich schrieb NSCoding Klasse und ich habe alles wie Speichern und Abrufen. Ich möchte wissen, wie man sich in diesem trennt. oder kann ich ganzen Teil zu einem Array hinzufügen und kodieren/decodieren könnten Sie dies vorschlagen – kumar