【问题标题】:How to save array of tuples in UserDefaults如何在 UserDefaults 中保存元组数组
【发布时间】:2018-07-18 12:40:28
【问题描述】:

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

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

我研究并发现我可能需要使用以下方法进行保存:

NSKeyedArchiver.archivedDataWithRootObject

这用于检索:

NSKeyedUnarchiver.unarchiveObjectWithData

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

【问题讨论】:

  • 你应该看看 Codable 协议(Swift 4 / Xcode 9.x)。不要使用 UserDefaults 来持久化您的 App 数据。使用结构而不是元组,只需将生成的 JSON 数据数组写入应用程序支持文件夹。

标签: ios swift userdefaults


【解决方案1】:

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)

【讨论】:

    【解决方案2】:

    您必须将元组转换为字典才能保存,这不是一种正确的方法,而是将您的元组转换为自定义对象,然后符合NSCoding 协议以获得在数据和对象之间转换的正确方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多