繁体   English   中英

使用 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()


  }

现在数组国家包含我的 plist 行。 (充满行数据并且工作正常)。 我的问题是如何将这个数组保存在 UserDefaults 中,因为它是一个字典数组,看起来有点复杂。 我这样做就像底部的代码一样,但它在应用程序委托中抛出了一个线程。

我在 viewdidload 中添加了这一行来调用 save function

savePlaces()

然后这是我的 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")
    }


}

似乎问题是由于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 ,但我不知道为什么,我会非常感谢任何想法

您不能使用NSKeyedArchiver序列化struct

CountryDecodable替换Codable并使用它来保存数组

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM