如何解码从 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
文件夹中的自定义文件是首选。
我正在做一个项目,它有一个包含多行字典的 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
文件夹中的自定义文件是首选。