我在我的一个文件中使用了一个数组元组,并想开始将它保存在 UserDefaults
中。以下是我存储当前数据的方式:
typealias savemytuple = (Name: String, NameID: String, BookID: String, Picture: NSData)
var savefun = [savemytuple]()
我已经研究并发现我可能需要对以下内容进行一些保存:
NSKeyedArchiver.archivedDataWithRootObject
这用于检索:
NSKeyedUnarchiver.unarchiveObjectWithData
不确定这种方式是否可行,因为我的元组有多种数据类型。关于如何执行此操作的任何想法?
最佳答案
UserDefaults
中的值必须是 property lists ,因此您需要将每个元组转换为属性列表。 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)
关于ios - 如何在 UserDefaults 中保存元组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48677102/