【问题标题】:JSON into Model extensionJSON 到模型扩展
【发布时间】:2017-11-02 16:53:09
【问题描述】:

我有以下类,我想编写一个扩展方法来轻松地将我的 JSON 序列化为。

class Evaluation: Object {
    var name: String?
    var isFinalized: Bool?
    var id: Int?
    var idString: String? {
        get{
            return String(describing:self.id!)
        }
    }

    convenience init(json: JSON?) {
        self.init()
        if let json = json {
            name = json["evaluationDescription"].rawString()
            isFinalized = json["evaluationFinalized"].intValue == 0 ? false : true
            id = json["evaluationID"].intValue
        }
    }

    override static func primaryKey() -> String? {
        return "id"
    }
}

这是我编写的扩展,但我希望它能够变异并且更全局可用。这样我就可以对所有模型使用相同的代码。

extension Evaluation {
    func serialize(from json: JSON){
        var temp = [Evaluation]()
        for (_,j): (String,JSON) in json {
            temp.append(Evaluation(json: j))
        }
    }
}

我尝试制作mutating的方法,但是出错了

'mutating' 对类中的方法无效...

总而言之,我想这样使用它(json有点伪代码)...

var json = "{'name':'test','isFinalized','0','id':'532'}"

var evaluations = [Evaluations]()
evaluations.serialize(from: json)

【问题讨论】:

    标签: swift realm swifty-json


    【解决方案1】:

    Swift 4 有一个名为 Codable 的新协议。如果你希望你的类是可序列化的,你只需要让你的类采用这个协议。像这样:

    class Evaluation: Object, Codable {
        var name: String?
        var isFinalized: Bool?
        var id: Int?
        var idString: String? {
            get{
                return String(describing:self.id!)
            }
        }
    }
    

    由于您的所有属性都来自 Swift 标准库,因此您的类已准备好使用 JSONEncoder 类型进行序列化。

    let evaluation = Evaluation()
    let encoded = try? JSONEncoder().encode(evaluation)
    

    并像这样解码:

    let decoded = try? JSONDecoder().decode(Evaluation.self, encoded)
    

    由于该协议自动使您的类可序列化,因此您不需要初始化器,因此可以是这样的:

    class Evaluation: Object, Codable {
        var name: String
        var isFinalized: Bool
        var id: Int
        var idString: String {
            get{
                return String(describing:self.id!)
            }
        }
    }
    

    此外,如果您的模型不需要是类,请将其设为结构。结构体使用较少的计算来实例化并且更多Value Type Oriented Programming

    如需了解更多信息,请访问Swift Documentation

    【讨论】:

    • 感谢您的回答。我会尝试一下,但是,我使用的是 Realm,所以我必须使用初始化程序或默认值。
    • 只是一个简短的说明;在很多情况下,结构体是个好主意,但 Realm 模型类型必须是类。
    【解决方案2】:

    protocol JSONable { init?(参数: JSON) }

    //MARK:- JSON 扩展 JSON { func to(type: T?) -> 任何? { if let baseObj = type as? JSONable.Type { if self.type == .array { var arrObject: [Any] = [] arrObject = self.arrayValue.map { baseObj.init(parameter: $0)! } 返回 arrObject } else { 让 object = baseObj.init(parameter: self) 返回对象! } } 返回零 } }

    【讨论】:

    • 请编辑您的答案以适当地格式化代码。
    • 你应该解释它在做什么。
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2020-11-29
    • 2010-09-27
    • 2021-09-16
    相关资源
    最近更新 更多