首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JsonEncoder总是返回空数组

JsonEncoder总是返回空数组
EN

Stack Overflow用户
提问于 2019-03-15 12:22:36
回答 2查看 322关注 0票数 1

我试图将struct数组保存到UserDefaults中,但我不知道为什么JsonEncoder返回空数据。我有符合可编码协议的安装模型

代码语言:javascript
复制
struct MenuItem : Codable{
    let name : String?
    let icon : String?

    init(name : String?, icon : String?){
        self.name = name
        self.icon = icon
    }
}

还创建了默认管理器,以便将其保存到用户默认值中。

代码语言:javascript
复制
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都会返回空数据。我试着用谷歌搜索,但没有成功。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-15 12:44:24

这是一个很常见的错误。

在计算属性的设置器中,新值由隐式newValue变量表示,而不是属性本身。

代码语言:javascript
复制
set {
   let json = codeToJson(data: newValue)
   UserDefaults.standard.set(json, forKey: "key")
}
票数 1
EN

Stack Overflow用户

发布于 2019-03-15 12:27:49

Array<T>.self更改为[MenuItem].self

代码语言:javascript
复制
   return try JSONDecoder().decode([MenuItem].self, from: jsonData)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55182517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档