JsonEncoder 总是 return 空数组
JsonEncoder always return empty array
我正在尝试将结构数组保存到 UserDefaults 中,但我无法弄清楚为什么 JsonEncoder return 为空数据。我有符合 Codable 协议的设置模型
struct MenuItem : Codable{
let name : String?
let icon : String?
init(name : String?, icon : String?){
self.name = name
self.icon = icon
}
}
并且还创建了默认管理器以将其保存到用户默认设置中。
class DefaultsManager {
static let shared = DefaultsManager()
init(){}
var items: [MenuItem]{
get{
if let json = UserDefaults.standard.data(forKey: "key"){
return decodeFromJson(jsonData: json)
} else {
return []
}
}
set{
let json = codeToJson(data: items)
UserDefaults.standard.set(json, forKey: "key")
}
}
fileprivate func codeToJson<T:Codable>(data: Array<T>) -> Data?{
do {
return try JSONEncoder().encode(data)
} catch {
print(error)
return nil
}
}
fileprivate func decodeFromJson<T:Codable>(jsonData: Data) -> [T]{
do {
return try JSONDecoder().decode(Array<T>.self, from: jsonData)
} catch {
print(error)
return []
}
}
}
但无论我做什么,JsonEncoder return 都是空数据。我尝试 google 但没有成功。
将Array<T>.self
更改为[MenuItem].self
return try JSONDecoder().decode([MenuItem].self, from: jsonData)
这是一个很常见的错误。
在计算的 属性 的 setter 中, 新值 由隐式 newValue
变量表示,它不是 属性本身。
set {
let json = codeToJson(data: newValue)
UserDefaults.standard.set(json, forKey: "key")
}
我正在尝试将结构数组保存到 UserDefaults 中,但我无法弄清楚为什么 JsonEncoder return 为空数据。我有符合 Codable 协议的设置模型
struct MenuItem : Codable{
let name : String?
let icon : String?
init(name : String?, icon : String?){
self.name = name
self.icon = icon
}
}
并且还创建了默认管理器以将其保存到用户默认设置中。
class DefaultsManager {
static let shared = DefaultsManager()
init(){}
var items: [MenuItem]{
get{
if let json = UserDefaults.standard.data(forKey: "key"){
return decodeFromJson(jsonData: json)
} else {
return []
}
}
set{
let json = codeToJson(data: items)
UserDefaults.standard.set(json, forKey: "key")
}
}
fileprivate func codeToJson<T:Codable>(data: Array<T>) -> Data?{
do {
return try JSONEncoder().encode(data)
} catch {
print(error)
return nil
}
}
fileprivate func decodeFromJson<T:Codable>(jsonData: Data) -> [T]{
do {
return try JSONDecoder().decode(Array<T>.self, from: jsonData)
} catch {
print(error)
return []
}
}
}
但无论我做什么,JsonEncoder return 都是空数据。我尝试 google 但没有成功。
将Array<T>.self
更改为[MenuItem].self
return try JSONDecoder().decode([MenuItem].self, from: jsonData)
这是一个很常见的错误。
在计算的 属性 的 setter 中, 新值 由隐式 newValue
变量表示,它不是 属性本身。
set {
let json = codeToJson(data: newValue)
UserDefaults.standard.set(json, forKey: "key")
}