如何在 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 类型