在我的代码中,数据是一个格式为 [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
我做错了什么?
答案 0 :(得分:0)
您只能在 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)