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

Swift 如何在userdefault中存储和检索数据?(例如:结构的数组),swift,userdefaults,Swift,Userdefaults,如何将类别Holarray存储为用户默认值 我试过了 存储用户默认值: struct ExpandableNames:Codable { var isExpanded: Bool var names: [String] var icons: [String] } var names = ["Food/Drink", "Tours", "Transport", "Gifts","Flights", "Shopping", "Activities","Entertainm

如何将
类别Holarray
存储为用户默认值

我试过了

存储用户默认值:

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]()
检索数据的问题就在这里

 UserDefaults.standard.set(try? PropertyListEncoder().encode(categoryWholeArray), forKey:"categoryWholeArray")
如果let data=UserDefaults.standard.value(forKey:“categoryWholeArray”)为?资料{
let songs2=try?PropertyListDecoder().decode(Array.self,from:data)
}
有人试过吗?

除了

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

UserDefaults
中存储数据时,您需要
编码
数据,当您试图获取这些数据时,必须
解码
数据

这是我的
分机
可能对你有帮助

if let data = UserDefaults.standard.value(forKey:"categoryWholeArray") as? Data {
    let songs2 = try? PropertyListDecoder().decode([Int:ExpandableNames].self, from: data)
    print(songs2)
}
扩展用户默认值{
func setCustomObjToUserDefaults(CustomeObj:AnyObject,forKey:String){
让defaults=UserDefaults.standard
让encodedData=NSKeyedArchiver.archivedData(withRootObject:CustomeObj)
defaults.set(encodedData,forKey:forKey)
defaults.synchronize()
}
func getCustomObjFromUserDefaults(forKey:String)->AnyObject{
让defaults=UserDefaults.standard
如果默认值为.object(forKey:forKey)!=nil{
如果let decoded=defaults.object(forKey:forKey)作为?数据{
让decodedTeams=NSKeyedUnarchiver.unarchiveObject(带:decoded)作为AnyObject
返回解码团队
}
}
归零
}
func setJsonObject(可编码:T,forKey:String){
如果let data=try?JSONEncoder().encode(可编码){
集合(数据,forKey:key)
}
}
func getJsonObject(uType:T.type,forKey:String)->T{
如果让数据=对象(forKey:key)作为数据,
让value=try?JSONDecoder().decode(类型,from:data){
返回值
}
归零
}
func removeCustomObject(forKey:String)
{
让defaults=UserDefaults.standard
defaults.removeObject(forKey:forKey)
defaults.synchronize()
}
}

如果您仍然需要帮助,请告诉我@ManikandanS
songs2
已声明,使用了
songs2
。打字错误?不是我的否决票,而是用户默认值。它不是用来存储数据的。它只应用于存储首选项btw,而不应使用
值(forKey:)
它是用于KVO的。UserDefaults有一个特定的方法来检索数据,称为
data(forKey:)
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()
    }

}