我正在其中一个文件中使用数组元组,并希望开始将其保存在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
。
Codable
struct
后,您可以通过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
,只需简单地将元组转换为字典,并有另一个函数转换回元组类型。