Сохранение массива словарей из plist с помощью UserDefaults - PullRequest
0 голосов
/ 16 октября 2019

Мне нужно сохранить свой массив с 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, но я не знаю почему, и я буду признателен за любые идеи

1 Ответ

2 голосов
/ 16 октября 2019

Нельзя сериализовать struct s с NSKeyedArchiver.

In Country, заменить Decodable на Codable и использовать его для сохранения массива

func savePlaces() 
{
    do {
        let placesData = try PropertyListEncoder().encode(countries)                 
        UserDefaults.standard.set(placesData, forKey: "places")
    } catch {
        print(error)
    }
}
...