JSON进入模型扩展

时间:2017-11-02 16:53:10

标签: swift realm swifty-json

我有以下课程,我想编写一个扩展方法,以便轻松地将我的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,但收到错误

  

'突变'对于类中的方法无效...

总之,我喜欢这样使用它(json有点伪代码)...

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

协议JSONable {初始化?(参数:JSON)}

// MARK:-JSON 扩展名JSON {func to(type:T?)->可以吗? {如果让baseObj =类型为? JSONable.Type {如果self.type == .array {var arrObject:[Any] = [] arrObject = self.arrayValue.map {baseObj.init(parameter:$ 0)! } return arrObject} else {让object = baseObj.init(parameter:self)返回对象! }} return nil}}