mbr*_*o12 4 ios swift userdefaults
我在我的一个文件中使用了一个数组元组,并希望开始保存它UserDefaults.以下是我存储当前数据的方式:
typealias savemytuple = (Name: String, NameID: String, BookID: String, Picture: NSData)
var savefun = [savemytuple]()
Run Code Online (Sandbox Code Playgroud)
我已经研究过,发现我可能需要对以下内容进行一些保存:
NSKeyedArchiver.archivedDataWithRootObject
Run Code Online (Sandbox Code Playgroud)
这用于检索:
NSKeyedUnarchiver.unarchiveObjectWithData
Run Code Online (Sandbox Code Playgroud)
不确定这种方式是否有效,因为我的元组有多种数据类型.有关如何做到这一点的任何想法?
rob*_*off 11
值UserDefaults必须是属性列表,因此您需要将每个元组转换为属性列表.A Data是属性列表,有几种方法可以将事物转换为Data.
一种方法是停止使用元组并使用struct替代.如果所有struct存储的属性都符合Codable,那么您可以通过声明一致性来让Swift生成使struct自身符合的所有内容Codable.双方String并Data符合Codable.
一旦struct是Codable,你可以将其中的一个,甚至是通过他们的阵列,成一个属性列表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)
Run Code Online (Sandbox Code Playgroud)
您必须将元组转换为字典才能保存它,这不是真正正确的方法,而是将元组转换为自定义对象,然后符合NSCoding协议以在数据和对象之间进行转换的正确方法。
您实际上并不需要NSKeyedArchiver.archivedDataWithRootObject,只需将元组转换为字典,然后使用另一个函数将其转换回元组类型。