如何解码从 userDeafults 保存和读取的数组数据 - Swift

How to decode data of an array that is save and read from userDeafults - Swift

我正在做一个项目,它有一个包含多行字典的 plist,然后,我把所有的数据行放到一个数组中,并将它保存到 useDefaults 中,所有这些看起来都是正确的,但是在 read 方法中,我知道我的数据似乎是编码的,并且以代码显示。像这样 (6b756e74) 我想知道如何以非常正确的方式解码我的数据。这是我的代码

struct Country : Codable {
    let orFlagEmoji, destFlagEmoji : String

    private enum CointryKeys : String, CodingKey { case orFlagEmoji, destFlagEmoji }
}

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()
      readPlaces()
   }

   func savePlaces(){

    do
    {
        let placesData = try PropertyListEncoder().encode(countries)
        UserDefaults.standard.set(placesData , forKey: "places")

        return
    }
    catch
    {
    print("SaveError")
    }


}

func readPlaces()
{

    let loadedcart = UserDefaults.standard.object(forKey: "places")

    print(loadedcart as Any)

}

问题是,当我在控制台中打印 loadedcart(它应该包含国家/地区数据)时,数据似乎已被编码。输出是一些数字不是我的字符串数据。如果有人帮我改正,我真的很感激。非常感谢

首先删除readPlaces。毫无意义

func readPlaces()
{   
    let loadedcart = UserDefaults.standard.object(forKey: "places")    
    print(loadedcart as Any)    
}

也删除

private enum CointryKeys : String, CodingKey { case orFlagEmoji, destFlagEmoji }

因为这些键从未被使用过(甚至没有正确拼写 CountryKeys)。


基本上你加载和保存数据的代码是正确的,它只是被误用了。

检查UserDefaults中的键places是否为空。如果是这样,从包中复制数据

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)
    }
}

总是在修改 countries 之后调用 savePlaces(除了 viewDidLoad)

如评论中所述,UserDefaults 不是保存大量数据的正确位置。 Documents 文件夹中的自定义文件是首选。