使用 Codable 歸檔 Swift 對象
UserDefaults非常適合存儲簡單的設(shè)置,例如整數(shù)和布爾值,但是當(dāng)涉及復(fù)雜數(shù)據(jù)時——例如自定義Swift類型——我們需要做更多的工作。
我們可以使用以下簡單的User數(shù)據(jù)結(jié)構(gòu):
- struct User {
- var firstName: String
- var lastName: String
- }
它有兩個字符串,但并不特殊——它們只是一段文本。整數(shù),布爾值(真或假)和Double也是如此。這些值的數(shù)組和字典也很容易想到:一個字符串,然后是另一個,然后是第三個,依此類推。
當(dāng)使用這樣的數(shù)據(jù)時,Swift為我們提供了一個很棒的協(xié)議,稱為Codable:一種專門用于存檔和取消存檔數(shù)據(jù)的協(xié)議,這是一種“將對象轉(zhuǎn)換為純文本然后再次轉(zhuǎn)換”的奇特方式。
我們將在未來的項目中更多地研究Codable,但是目前我們的需求很簡單:我們想要歸檔一個自定義類型,以便可以將其放入UserDefaults中,然后在從UserDefaults中返回時將其取消存檔。
當(dāng)使用僅具有簡單屬性的類型(字符串,整數(shù),布爾值,字符串?dāng)?shù)組等)時,支持歸檔和取消歸檔的唯一需要做的就是向Codable添加一致性,如下所示:
- struct User: Codable {
- var firstName: String
- var lastName: String
- }
Swift將自動為我們生成一些代碼,這些代碼將根據(jù)需要為我們存檔和取消存檔User實例,但是我們?nèi)匀恍枰嬖VSwift何時存檔以及如何處理數(shù)據(jù)。
該過程的這一部分由稱為JSONEncoder的新類型提供支持。它的工作是獲取符合Codable的內(nèi)容,然后以 JavaScript Object Notation(JSON)的形式發(fā)送回該對象。該名稱暗示它特定于JavaScript,但實際上,我們都使用它,因為它是如此的快速和簡單。
Codable協(xié)議不需要我們使用JSON,實際上可以使用其他格式,但這是迄今為止最常見的格式。在這種情況下,我們實際上并不在乎使用哪種數(shù)據(jù),因為它們只會存儲在UserDefaults中。
要將用戶數(shù)據(jù)轉(zhuǎn)換為JSON數(shù)據(jù),我們需要在JSONEncoder上調(diào)用encode()方法。這可能會引發(fā)錯誤,因此應(yīng)使用try或try?進行調(diào)用來整齊地處理錯誤。例如,如果我們有一個屬性來存儲User實例,如下所示:
- @State private var user = User(firstName: "Taylor", lastName: "Swift")
然后,我們可以創(chuàng)建一個將用戶存檔的按鈕,并將其保存到UserDefaults中,如下所示:
- Button("Save User") {
- let encoder = JSONEncoder()
- if let data = try? encoder.encode(self.user) {
- UserDefaults.standard.set(data, forKey: "UserData")
- }
- }
該數(shù)據(jù)常量是一種新的數(shù)據(jù)類型,可能會讓人感到困惑。它旨在存儲您可以想到的任何類型的數(shù)據(jù),例如字符串,圖像,zip文件等。不過,在這里,我們只關(guān)心它是可以直接寫入UserDefaults中的數(shù)據(jù)類型之一。
當(dāng)我們返回另一種方式時(當(dāng)我們擁有JSON數(shù)據(jù)并且想要將其轉(zhuǎn)換為Swift Codable類型時),我們應(yīng)該使用JSONDecoder而不是JSONEncoder,但是過程大致相同。
這使我們進入了項目概述的末尾,因此繼續(xù)進行,將您的項目重置為其初始狀態(tài),以便進行構(gòu)建。
本文轉(zhuǎn)載自微信公眾號「Swift社區(qū)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Swift社區(qū)公眾號。




























