2017-08-06 2 views
1

Ich habe eine komplexe Klassenobjekt wie folgt:Speichern Sie ein komplexes Objekt in iOS?

class Ride { 
    var distance:String? 
    var price:Double? 
    var Legs:[Leg]? 
    var Routes:[Route]? 
} 

class Leg { 
    var id:int? 
    var value:string? 
} 

class Route { 
    var id:int? 
    var value:string? 
} 

Was ich will, ist diese Plan JSON oder was auch immer mit den Werten und lesen und schreiben, wenn ich brauchte. Mein Ansatz war nach dem Erstellen Objekt mit Daten serialisieren zu JSON und schreibe in ridesjson.json Datei und dann wenn ich von diesem JSON lesen möchte ich auf Ride-Objekt zu serialisieren. Kann ich das tun oder gibt es einen guten Weg, dies zu tun?

Antwort

1

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) 
Verwandte Themen