如何在UserDefaults中保存元组数组

时间:2018-02-08 03:34:00

标签: ios swift userdefaults

我在我的一个文件中使用了一个数组元组,并希望开始在UserDefaults中保存它。以下是我存储当前数据的方式:

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

我已经研究过并发现我可能需要对以下内容进行一些保存:

NSKeyedArchiver.archivedDataWithRootObject

这用于检索:

NSKeyedUnarchiver.unarchiveObjectWithData

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

2 个答案:

答案 0 :(得分:10)

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

一种方法是停止使用元组并使用struct代替。如果所有struct存储的属性都符合Codable,那么您可以让Swift生成使struct本身符合Codable所需的一切通过宣布一致性。 StringData都符合Codable

structCodable后,您可以通过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)

答案 1 :(得分:0)

您必须将元组转换为字典以保存它,而不是真正的正确方法,而是将您的元组转换为自定义对象,然后使NSCoding协议符合正确的方式在数据和对象之间进行转换。< / p>

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