使用 UserDefaults 保存来自 plist 的字典数组
Saving an array of dictionary coming from plist , with UserDefaults
我需要用 UserDefaults 保存我的数组,因为我希望用户能够自己添加或删除行。我有一个包含多行字典的 plist。我用 plist 上的行填充数组名称国家/地区,如下所示
var imageList = ["usaflag","gerflag","franceflag","jpflag","gerflag"]
var countries = [Country]()
override func viewDidLoad() {
super.viewDidLoad()
let urlPlist = Bundle.main.url(forResource: "ListinFirstPage", withExtension: "plist")!
let data = try! Data(contentsOf: urlPlist)
do
{
countries = try PropertyListDecoder().decode([Country].self, from: data)
}
catch
{
// Handle error
print(error)
}
savePlaces()
}
现在 Array countries 包含我的 plist 行。 (填充行数据并且工作正常)。我的问题是如何将这个数组保存在 UserDefaults 中,因为它是一个字典数组,看起来有点复杂。我这样做就像底部的代码一样,但它在应用程序委托中引发了一个线程。
我在 viewdidload 中添加了这一行来调用保存功能
savePlaces()
然后这是我的 savePlaces 函数
func savePlaces(){
do
{
let placesData = try NSKeyedArchiver.archivedData(withRootObject: countries, requiringSecureCoding: false)
UserDefaults.standard.set(placesData, forKey: "places")
print("Here is save function")
}
catch
{
print("SaveError")
}
}
看来问题是因为 countries
数组,它是来自 plist 的字典数组,因为当我更改此行时
let placesData = try NSKeyedArchiver.archivedData(withRootObject: countries, requiringSecureCoding: false)
到这个
let placesData = try NSKeyedArchiver.archivedData(withRootObject: imageList, requiringSecureCoding: false)
我的意思是我将国家/地区更改为 imageList,它是一个字符串数组,它工作正常。我在第一行定义了图像列表
var imageList = ["usaflag","gerflag","franceflag","jpflag","gerflag"]
所以问题是 countries
但我不知道为什么,我将非常感谢任何想法
您不能将 struct
序列化为 NSKeyedArchiver
。
在 Country
中用 Codable
替换 Decodable
并用它来保存数组
func savePlaces()
{
do {
let placesData = try PropertyListEncoder().encode(countries)
UserDefaults.standard.set(placesData, forKey: "places")
} catch {
print(error)
}
}
我需要用 UserDefaults 保存我的数组,因为我希望用户能够自己添加或删除行。我有一个包含多行字典的 plist。我用 plist 上的行填充数组名称国家/地区,如下所示
var imageList = ["usaflag","gerflag","franceflag","jpflag","gerflag"]
var countries = [Country]()
override func viewDidLoad() {
super.viewDidLoad()
let urlPlist = Bundle.main.url(forResource: "ListinFirstPage", withExtension: "plist")!
let data = try! Data(contentsOf: urlPlist)
do
{
countries = try PropertyListDecoder().decode([Country].self, from: data)
}
catch
{
// Handle error
print(error)
}
savePlaces()
}
现在 Array countries 包含我的 plist 行。 (填充行数据并且工作正常)。我的问题是如何将这个数组保存在 UserDefaults 中,因为它是一个字典数组,看起来有点复杂。我这样做就像底部的代码一样,但它在应用程序委托中引发了一个线程。
我在 viewdidload 中添加了这一行来调用保存功能
savePlaces()
然后这是我的 savePlaces 函数
func savePlaces(){
do
{
let placesData = try NSKeyedArchiver.archivedData(withRootObject: countries, requiringSecureCoding: false)
UserDefaults.standard.set(placesData, forKey: "places")
print("Here is save function")
}
catch
{
print("SaveError")
}
}
看来问题是因为 countries
数组,它是来自 plist 的字典数组,因为当我更改此行时
let placesData = try NSKeyedArchiver.archivedData(withRootObject: countries, requiringSecureCoding: false)
到这个
let placesData = try NSKeyedArchiver.archivedData(withRootObject: imageList, requiringSecureCoding: false)
我的意思是我将国家/地区更改为 imageList,它是一个字符串数组,它工作正常。我在第一行定义了图像列表
var imageList = ["usaflag","gerflag","franceflag","jpflag","gerflag"]
所以问题是 countries
但我不知道为什么,我将非常感谢任何想法
您不能将 struct
序列化为 NSKeyedArchiver
。
在 Country
中用 Codable
替换 Decodable
并用它来保存数组
func savePlaces()
{
do {
let placesData = try PropertyListEncoder().encode(countries)
UserDefaults.standard.set(placesData, forKey: "places")
} catch {
print(error)
}
}