Мне нужно сохранить свой массив с UserDefaults, потому что я хочу, чтобы пользователи могли добавлять или удалять строки сами. У меня в плисте есть ряды словарей. Я заполняю массив имен стран строками на листе, как это
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()
}
Теперь в массивах стран содержатся мои списки строк. (заполнен данными строк и работает нормально). Моя проблема заключается в том, как сохранить этот массив в 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
, но я не знаю почему, и я буду признателен за любые идеи