Swift 将JSON转换为模型扩展
我有一个类,我想为它编写一个扩展方法,以便轻松地将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
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请注意,结构在很多情况下都是一个好主意,但是领域模型类型必须是类。请编辑您的答案,以适当地格式化代码。您应该提供关于它所做的事情的解释。请编辑您的答案,以适当地格式化代码。您应该提供关于它所做的事情的解释。