In Swift 3 ist der Standardansatz ein Objekt in eine Datei serialisiert ist es NSCoding zu machen nehmen (es hat ein NSObject sein für diese zu arbeiten) und implementieren encode(with:)
und init(coder:)
. Dann können Sie in eine Daten archivieren und speichern (und umgekehrt die Prozedur, um es zu lesen).
class Person: NSObject, NSCoding {
var firstName : String
var lastName : String
override var description : String {
return self.firstName + " " + self.lastName
}
init(firstName:String, lastName:String) {
self.firstName = firstName
self.lastName = lastName
super.init()
}
func encode(with coder: NSCoder) {
coder.encode(self.lastName, forKey: "last")
coder.encode(self.firstName, forKey: "first")
}
required init(coder: NSCoder) {
self.lastName = coder.decodeObject(forKey:"last") as! String
self.firstName = coder.decodeObject(forKey:"first") as! String
super.init()
}
}
Hier ist ein Beispiel es der Archivierung:
let fm = FileManager.default
let docsurl = try fm.url(for:.documentDirectory,
in: .userDomainMask, appropriateFor: nil, create: false)
let moi = Person(firstName: "Matt", lastName: "Neuburg")
let moidata = NSKeyedArchiver.archivedData(withRootObject: moi)
let moifile = docsurl.appendingPathComponent("moi.txt")
try moidata.write(to: moifile, options: .atomic)
wir es hier dearchivieren:
let fm = FileManager.default
let docsurl = try fm.url(for:.documentDirectory,
in: .userDomainMask, appropriateFor: nil, create: false)
let moifile = docsurl.appendingPathComponent("moi.txt")
let persondata = try Data(contentsOf: moifile)
let person = NSKeyedUnarchiver.unarchiveObject(with: persondata) as! Person
print(person) // "Matt Neuburg"
In Swift 4, jedoch kann es einfacher sein, die Kodierbare Protokoll zu verwenden, um um Ihr Objekt seriell als Eigenschaftsliste oder als JSON mehr oder weniger automatisch zu machen. Codable funktioniert auf jedem Typ, einschließlich einer Struktur. Das ist alles was man braucht:
struct Person : Codable {
let firstName : String
let lastName : String
}
Hier ist, wie eine Person zu archivieren:
let p = Person(firstName: "Matt", lastName: "Neuburg")
let penc = PropertyListEncoder()
let d = try! penc.encode(p)
, dass ein Datenobjekt ist, und Sie können es direkt auf der Festplatte wie im vorherigen Beispiel write
. Das Archivieren ist genauso einfach. Nehmen wir an, d
sind die Daten, die Sie von der Festplatte gelesen haben:
let p = try! PropertyListDecoder().decode(Person.self, from: d)