如何在UserDefaults中保存元组数组

9

我在我的一个文件中使用了一个数组元组,并且想要开始将其保存在UserDefaults中。这是我目前存储数据的方式:

typealias savemytuple = (Name: String, NameID: String, BookID: String, Picture: NSData)
var savefun = [savemytuple]()

我已经调研发现,为了保存数据,我可能需要对以下内容进行处理:

NSKeyedArchiver.archivedDataWithRootObject

这是用于检索的代码:

NSKeyedUnarchiver.unarchiveObjectWithData

我不确定这种方法是否可行,因为我的元组具有多种数据类型。 有任何想法如何做到这一点吗?


1
你应该看一下 Codable 协议(Swift 4 / Xcode 9.x)。不要使用 UserDefaults 来持久化你的应用数据。使用结构体代替元组,将你的结果 JSON 数据数组写入应用程序支持文件夹。 - Leo Dabus
2个回答

16
UserDefaults中的值必须是属性列表,因此您需要将每个元组转换为属性列表。 Data 是属性列表,有几种方法可以将事物转换为 Data

一种方法是停止使用元组,改用struct。如果所有struct的存储属性都符合Codable,那么您可以要求Swift生成所需的所有内容,使struct本身符合Codable,只需声明一致性即可。 StringData都符合Codable

一旦struct符合Codable,您就可以通过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)

0

你需要将元组转换为字典来保存它,但这并不是一个很好的方法。相反,你应该将元组转换为一个自定义对象,然后符合NSCoding协议,以便在数据和对象之间进行正确的转换。

你并不真正需要使用NSKeyedArchiver.archivedDataWithRootObject,只需要将元组简单地转换为字典,再编写另一个函数将其转换回元组类型即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接