[英]How to save array of tuples in UserDefaults
我在我的一個文件中使用了一個數組元組,並希望開始在UserDefaults
保存它。 以下是我存儲當前數據的方式:
typealias savemytuple = (Name: String, NameID: String, BookID: String, Picture: NSData)
var savefun = [savemytuple]()
我已經研究過,發現我可能需要對以下內容進行一些保存:
NSKeyedArchiver.archivedDataWithRootObject
這用於檢索:
NSKeyedUnarchiver.unarchiveObjectWithData
不確定這種方式是否有效,因為我的元組有多種數據類型。 有關如何做到這一點的任何想法?
UserDefaults
的值必須是屬性列表 ,因此您需要將每個元組轉換為屬性列表。 Data
是屬性列表,有幾種方法可以將事物轉換為Data
。
一種方法是停止使用元組並使用struct
代替。 如果所有struct
的存儲屬性都符合Codable
,那么你可以通過聲明一致性來讓Swift生成使struct
本身符合Codable
所需的一切。 String
和Data
符合Codable
。
一旦struct
是Codable
,你可以通過JSONEncoder
或PropertyListEncoder
將其中一個,甚至是它們的數組轉換為屬性列表:
import Foundation
struct Bookie: Codable {
var name: String
var nameId: String
var bookId: String
var picture: Data
}
let bookies = [
Bookie(name: "mbro12", nameId: "id1", bookId: "b1", picture: Data()),
Bookie(name: "mayoff", nameId: "id2", bookId: "b2", picture: Data())
]
let bookiesData = try! PropertyListEncoder().encode(bookies)
UserDefaults.standard.set(bookiesData, forKey: "bookies")
let fetchedData = UserDefaults.standard.data(forKey: "bookies")!
let fetchedBookies = try! PropertyListDecoder().decode([Bookie].self, from: fetchedData)
print(fetchedBookies)
您必須將元組轉換為字典以保存它,而不是真正的正確方法,而是將您的元組轉換為自定義對象,然后使NSCoding
協議符合在數據和對象之間進行轉換的正確方法。
你真的不需要NSKeyedArchiver.archivedDataWithRootObject
,只需簡單地將元組轉換為一個字典,並有另一個函數轉換回元組類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.