尝试将数组保存到 UserDefaults

Posted

技术标签:

【中文标题】尝试将数组保存到 UserDefaults【英文标题】:Trying to save an array into UserDefaults 【发布时间】:2021-03-10 16:26:14 【问题描述】:

在我的代码中,data 是一个格式为 [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        

我做错了什么?

【问题讨论】:

我认为您发布的错误与您发布的代码无关,一定有其他代码导致此错误 你是对的,我编辑的帖子有正确的错误 它是特征对象的数组吗?您只能在用户的默认数据库中存储字符串、数字、日期对象和数据对象的数组。我认为您应该使您的数据类型符合 Codable 并使用 PropertyListEncoder 显示您的对象数据声明及其内容 显示您的 Feature 对象声明。符合 NSCoding 还是 NSSecureCoding? 【参考方案1】:

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

如果您想存储任何其他类型的对象,通常应该 归档它以创建 NSData 的实例。

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

首先将您的数据模型与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)

【讨论】:

以上是关于尝试将数组保存到 UserDefaults的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试将数组 ($sales) 保存到数据库中

将资产列表(数组)保存到特定的 CKRecord

Android Studio:将 URLS 从 URL 保存到数组

将 xhr.responseURL 保存到数组

如何将json对象数组保存到猫鼬?

如何将json对象数组保存到猫鼬?