Прежде всего удалите readPlaces
. Это бессмысленно
func readPlaces()
{
let loadedcart = UserDefaults.standard.object(forKey: "places")
print(loadedcart as Any)
}
Удалить также
private enum CointryKeys : String, CodingKey { case orFlagEmoji, destFlagEmoji }
, потому что ключи никогда не используются (даже не правильно написано CountryKeys
).
В основном ваш код для загрузки и сохранения данных правильный, он просто неправильно используется.
Проверьте, пуст ли ключ places
в UserDefaults
. Если это так, скопируйте данные из комплекта
var countries = [Country]()
override func viewDidLoad() {
super.viewDidLoad()
do {
try loadPlaces()
} catch { print(error) }
}
func loadPlaces() throws
{
let data : Data
if let placesData = UserDefaults.standard.data(forKey: "places") {
data = placesData
} else {
let urlPlist = Bundle.main.url(forResource: "ListinFirstPage", withExtension: "plist")!
data = try Data(contentsOf: urlPlist)
UserDefaults.standard.set(data, forKey: "places")
}
countries = try PropertyListDecoder().decode([Country].self, from: data)
}
func savePlaces()
{
do {
let placesData = try PropertyListEncoder().encode(countries)
UserDefaults.standard.set(placesData , forKey: "places")
} catch {
print("SaveError", error)
}
}
. Звоните savePlaces
всегда после изменения countries
(за исключением viewDidLoad)
Как указано в комментариях UserDefaults
неправильное место для сохранения большого набора данных. Предпочтителен пользовательский файл в папке Documents
.