I need to save my array with UserDefaults because I want users have ability to add or delete rows them selves. I have a plist contains rows of dictionaries. I fill an array name countries with the rows on plist like this
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()
}
Now the Array countries contains my plist rows. (filled with data of rows and works fine). my problem is how to save this array in UserDefaults, as it is an array of dictionaries seems it is a little complicated. I did this like the codes in bottom but it throws a thread in app delegate.
I added this line in viewdidload to call save function
savePlaces()
and then here is my savePlaces function
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")
}
}
It seems that problem is because of countries
array which it is an array of dictionaries coming from plist, because when I change this line
let placesData = try NSKeyedArchiver.archivedData(withRootObject: countries, requiringSecureCoding: false)
to this
let placesData = try NSKeyedArchiver.archivedData(withRootObject: imageList, requiringSecureCoding: false)
I mean I changed the countries to the imageList which is an array of strings, it works fine. I defined image list in first line
var imageList = ["usaflag","gerflag","franceflag","jpflag","gerflag"]
so the problem is countries
but I do not know why and I will really appreciate for any ideas
You cannot serialize struct
s with NSKeyedArchiver
.
In Country
replace Decodable
with Codable
and use that to save the array
func savePlaces()
{
do {
let placesData = try PropertyListEncoder().encode(countries)
UserDefaults.standard.set(placesData, forKey: "places")
} catch {
print(error)
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.