如何在用户默认值中保存元组数组



我正在其中一个文件中使用数组元组,并希望开始将其保存在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所需的一切,只需声明一致性即可。StringData都符合Codable

Codablestruct后,您可以通过JSONEncoderPropertyListEncoder将其中一个甚至数组转换为属性列表:

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,只需简单地将元组转换为字典,并有另一个函数转换回元组类型。

最新更新