簡體   English   中英

如何在UserDefaults中保存元組數組

[英]How to save array of tuples in UserDefaults

我在我的一個文件中使用了一個數組元組,並希望開始在UserDefaults保存它。 以下是我存儲當前數據的方式:

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

我已經研究過,發現我可能需要對以下內容進行一些保存:

NSKeyedArchiver.archivedDataWithRootObject

這用於檢索:

NSKeyedUnarchiver.unarchiveObjectWithData

不確定這種方式是否有效,因為我的元組有多種數據類型。 有關如何做到這一點的任何想法?

UserDefaults的值必須是屬性列表 ,因此您需要將每個元組轉換為屬性列表。 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)

您必須將元組轉換為字典以保存它,而不是真正的正確方法,而是將您的元組轉換為自定義對象,然后使NSCoding協議符合在數據和對象之間進行轉換的正確方法。

你真的不需要NSKeyedArchiver.archivedDataWithRootObject ,只需簡單地將元組轉換為一個字典,並有另一個函數轉換回元組類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM