2017-08-06 69 views
1

我有一個複雜的類對象,如下所示:在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? 
} 

我要的是這些存儲爲JSON或任何具有價值和讀取和寫入到它時,我需要的。我的方法是在數據序列化爲JSON並創建Ride對象後寫入ridesjson.json文件,然後當我想從該JSON讀取時,我想序列化爲Ride對象。我可以這樣做還是有什麼好方法可以做到這一點?

回答

1

在Swift 3中,將對象序列化到文件的標準方法是使其採用NSCoding(它必須是NSObject才能工作)並實現encode(with:)init(coder:)。然後你可以存檔到一個數據並保存(並且反過來讀取它)。

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() 
    } 

} 

這裏的歸檔它的一個例子:

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) 

在這裏,我們取消存檔:

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" 

在夫特4,但是,它可以是更容易使用的可編碼的協議,以便使您的對象可以作爲屬性列表或JSON或多或少自動地序列化。 Codable適用於任何類型,包括結構。這是所有需要:

struct Person : Codable { 
    let firstName : String 
    let lastName : String 
} 

下面是如何存檔人:

let p = Person(firstName: "Matt", lastName: "Neuburg") 
let penc = PropertyListEncoder() 
let d = try! penc.encode(p) 

這是一個數據對象,您可以直接write到磁盤與前面的例子所示。取消存檔也很簡單。假設d是您從磁盤讀取的數據:

let p = try! PropertyListDecoder().decode(Person.self, from: d)