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)