簡體   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