繁体   English   中英

尝试将数组保存到 UserDefaults

[英]Trying to save an array into UserDefaults

在我的代码中,数据是一个格式为 [String: Any] 的数组,我试图将其存储在 userdefaults 中

 let userDefaults = UserDefaults.standard
                let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: data)
                userDefaults.set(encodedData, forKey: "data")
                userDefaults.synchronize()

但我收到此错误:

   -[Features encodeWithCoder:]: unrecognized selector sent to instance        

我做错了什么?

您只能在 UserDefaults 中存储几种类型的对象,例如 Int、String、Float、Double、Bool、URL、Data 或这些类型的集合。 但是根据苹果:

如果要存储任何其他类型的 object,通常应该将其归档以创建 NSData 的实例。

幸运的是,Apple 发布了Codable ,因此任何 class 或符合 Codable 的结构都可以与 Data 相互转换。

首先使您的 dataModel 符合Codable

struct Features : Codable {
   var feature1:String?
   var feature2:String?
}

然后在创建对象并将它们添加到数组之后

let feature1 = Features(feature1: "awesome", feature2: "World")
let feature2 = Features(feature1: "Hello", feature2: "World")    
arrayOfFeatures = [feature1,feature2]

您可以像这样使用保存它们:

 func saveInUserDefault(with arrayOfFeatures:[Features]){
        do{
    UserDefaults.standard.set(try PropertyListEncoder().encode(arrayOfFeatures), forKey: "data")
    UserDefaults.standard.synchronize()
        }
        catch
        {
            print(error.localizedDescription)
        }
    }

并像这样得到它们:

func getDataFromArray(){
        if let savedData: Data = UserDefaults.standard.data(forKey: "data"){
            do
           {
            arrayOfFeatures = try PropertyListDecoder().decode([Features].self, from: savedData)
            for feature in arrayOfFeatures
            {
                print(feature.feature1)
                print(feature.feature2)
            }
           }
            catch
            {
                print(error.localizedDescription)
            }
        }
    }

    saveInUserDefault(with: arrayOfFeatures)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM