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