gpt4 book ai didi

swift - JSON 到模型扩展

转载 作者:行者123 更新时间:2023-11-28 12:14:50 26 4
gpt4 key购买 nike

我有以下类,我想编写一个扩展方法来轻松地将我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com