我有以下课程,我想编写一个扩展方法,以便轻松地将我的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)
答案 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}}