如何在 userdefault 中存储和检索数据? (例如:结构数组)

Posted

技术标签:

【中文标题】如何在 userdefault 中存储和检索数据? (例如:结构数组)【英文标题】:How to store and retrieve data in userdefault? (Ex:Array of Struct ) 【发布时间】:2019-05-21 12:10:05 【问题描述】:
struct ExpandableNames:Codable 
    var isExpanded: Bool
    var names: [String]
    var icons: [String]
 

var names = ["Food/Drink", "Tours", "Transport", "Gifts","Flights", "Shopping", "Activities","Entertainment","Accomodation","Other"]
var icons = ["Food_Category", "Tours", "Transport_Category", "Gifts_Category","Flights_Category","Shopping_Category","Activities_category","Entertainment_category", "Accomodation_Category","Other_Category"]

var categoryWholeArray = [Int:ExpandableNames]()

如何将categoryWholeArray 存储为用户默认值?

我试过了

存储用户默认值:

 UserDefaults.standard.set(try? PropertyListEncoder().encode(categoryWholeArray), forKey:"categoryWholeArray")

检索数据问题来了

   if let data = UserDefaults.standard.value(forKey:"categoryWholeArray") as? Data 
                      let songs2 = try? PropertyListDecoder().decode(Array<categoryWholeArray.values>.self, from: data)

有人试过吗?

【问题讨论】:

【参考方案1】:

您需要encode 数据同时存储在UserDefaults 中,当您尝试获取这些数据时,您必须需要decode 它。

这里是extension,我有可能对你有所帮助。

extension UserDefaults 

    func setCustomObjToUserDefaults(CustomeObj: AnyObject, forKey:String) 
        let defaults = UserDefaults.standard
        let encodedData = NSKeyedArchiver.archivedData(withRootObject: CustomeObj)
        defaults.set(encodedData, forKey: forKey)
        defaults.synchronize()
    

    func getCustomObjFromUserDefaults(forKey:String) -> AnyObject? 
        let defaults = UserDefaults.standard
        if defaults.object(forKey: forKey) != nil 
            if let decoded  = defaults.object(forKey: forKey) as? Data 
                let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with:decoded) as AnyObject
                return decodedTeams
            
        
        return nil
    

    func setJsonObject<T: Encodable>(encodable: T, forKey key: String) 
        if let data = try? JSONEncoder().encode(encodable) 
            set(data, forKey: key)
        
    

    func getJsonObject<T: Decodable>(_ type: T.Type, forKey key: String) -> T? 
        if let data = object(forKey: key) as? Data,
            let value = try? JSONDecoder().decode(type, from: data) 
            return value
        
        return nil
    

    func removeCustomObject(forKey:String)
    
        let defaults = UserDefaults.standard
        defaults.removeObject(forKey: forKey)
        defaults.synchronize()
    


【讨论】:

如果您还需要帮助,请告诉我@ManikandanS【参考方案2】:

除了

if let data = UserDefaults.standard.value(forKey:"categoryWholeArray") as? Data 
    let songs2 = try? PropertyListDecoder().decode([Int:ExpandableNames].self, from: data)
    print(songs2)

【讨论】:

songs2 已声明,song2 已使用。错字? 不是我的反对意见,而是 UserDefaults 它不是用来存储数据的。它应该只用于存储首选项 顺便说一句,你不应该使用 value(forKey:) 它是为 KVO 设计的。 UserDefaults 有一个特定的方法来检索数据,称为data(forKey:)

以上是关于如何在 userdefault 中存储和检索数据? (例如:结构数组)的主要内容,如果未能解决你的问题,请参考以下文章

从特定的核心数据表行中检索值 - 然后将值存储到 UserDefaults

您是不是能够跨不同的视图控制器/.swift 文件检索存储在 UserDefaults 中的数据?

如何从 Swift 类中检索目标 C 类中的 Userdefault?

在 UserDefaults 中存储 OpaquePointer 类型

Swift 5 将 AVAsset 保存到 UserDefaults

使用 UserDefaults 保存和检索布尔值