Swift 将JSON转换为模型扩展

Swift 将JSON转换为模型扩展,swift,realm,swifty-json,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

我有一个类,我想为它编写一个扩展方法,以便轻松地将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有点像伪代码)


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标准库,因此可以使用
jsonecoder
type对类进行序列化

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!)
        }
    }
}
由于此协议自动使您的类可序列化,因此您不需要初始值设定项,因此可以如下所示:

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!)
        }
    }
}
此外,如果您的模型不需要是一个类,那么将其设置为一个结构。结构使用更少的计算来实例化,并且更容易实现


有关这方面的更多信息,请访问。

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标准库,因此可以使用
jsonecoder
type对类进行序列化

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!)
        }
    }
}
由于此协议自动使您的类可序列化,因此您不需要初始值设定项,因此可以如下所示:

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!)
        }
    }
}
此外,如果您的模型不需要是一个类,那么将其设置为一个结构。结构使用更少的计算来实例化,并且更容易实现


有关这方面的更多信息,请访问。

协议JSO{init?(参数:JSON)}

//标记:-JSON 扩展JSON
{func to(type:T?->Any?{if let baseObj=type as?JSONable.type{if self.type==.array{var arrObject:[Any]=[]arrObject=self.arrayValue.map{baseObj.init(参数:$0)!}返回arrObject}否则{let object baseObj.init return object return object var}返回nil}

协议JSONable{init?(参数:JSON)}

//标记:-JSON 扩展JSON
{func to(type:T?->Any?{if let baseObj=type as?JSONable.type{if self.type==.array{var arrObject:[Any]=[]arrObject=self.arrayValue.map{baseObj.init(参数:$0)!}返回arrObject}否则{let object baseObj.init(参数:self)返回对象!}

谢谢你的回答。我会尝试一下,但是,我使用的是领域,所以我必须使用初始值设定项或默认值。请注意,结构在很多情况下都是一个好主意,但领域模型类型必须是类。谢谢你的回答。我会尝试一下,但是,我使用的是领域,所以我必须使用初始值设定项或默认值。Jus请注意,结构在很多情况下都是一个好主意,但是领域模型类型必须是类。请编辑您的答案,以适当地格式化代码。您应该提供关于它所做的事情的解释。请编辑您的答案,以适当地格式化代码。您应该提供关于它所做的事情的解释。