swift - 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 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' is not valid on methods in classes...

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

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

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

最佳答案

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

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)

由于此协议(protocol)自动使您的类可序列化,因此您不需要初始化器,因此它可以像这样:

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 .

关于swift - JSON 到模型扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47080662/

相关文章:

iOS swift Aspect Fit 左放置

android - 如何将 Realm 数据库文件与我的应用程序 bundle 在一起以通过安装进行部署

arrays - 快速删除数组中的项目

swift - 使用 SwiftyJSON 时,值有时会作为可选字符串返回

ios - 在 SwiftUI 中使用 LazyVGrid 替代背景颜色

python - 返回线性矩阵方程的最小二乘解的函数

ios - 在 Swift 应用程序中使用数据库来管理志愿者

swift - 使用 Alamofire 和 SwiftyJson 从函数返回值

ios - 如果文本结尾是笑脸或表情符号,UILabel 不会自动换行

android - 错误 : Parceler: Unable to find read/write generator for type io. Realm .RealmList