2017-08-06 15 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にシリアライズし、ridesjson.jsonファイルに書き込むライドオブジェクトを作成した後で、そのJSONから読み込みたいときに、ライドオブジェクトにシリアル化したいと考えました。これをすることができますか、これを行うには良い方法がありますか?

答えて

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) 

我々はそれをアーカイブ解除:スイフト4で

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" 

、しかし、ようにコード可能なプロトコルを使用する方が簡単であってもよいですオブジェクトをプロパティリストまたはJSONとしてシリアライズ可能にします。 Codableは構造体を含むあらゆる型で動作します。これは、それが取るすべてである:

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

はここで人をアーカイブする方法は次のとおりです。

データオブジェクトだとあなたは、前の例のように、ディスクに直接 writeでき
let p = Person(firstName: "Matt", lastName: "Neuburg") 
let penc = PropertyListEncoder() 
let d = try! penc.encode(p) 

。アーカイブを保存するのと同じくらい簡単です。ディスクから読み取ったデータはdとします。

let p = try! PropertyListDecoder().decode(Person.self, from: d) 
関連する問題