ios - 如何在 UserDefaults 中保存元组数组

标签 ios swift userdefaults

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

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

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

NSKeyedArchiver.archivedDataWithRootObject

这用于检索:

NSKeyedUnarchiver.unarchiveObjectWithData

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

最佳答案

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

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

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

关于ios - 如何在 UserDefaults 中保存元组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48677102/

相关文章:

iOS7 : UITapGestureRecognizer reuse issue

iphone - 是否有可通过 iOS 访问的 API 来检测醉酒者?

android - 如何根据Flutter Widget中的括号设置宽度

ios - xmpp iOS : How to retrieve all registered users from openfire Server

iOS Swift : SQLite. swift 错误 - 找不到 header

ios - 是否可以使用 settings.bundle 在应用程序内显示首选项?

swift - 如何安全地从用户默认值中解包值?

ios - 每次 Xcode 重新启动时 View 错位

swift - 如何快速实现自定义错误抛出语法?

swift - 无法解码数据 Swift