在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)