Swift 领域对象和可映射
Swift Realm Object and Mappable
我在 swift
中使用 "Realm" 和 "ObjectMapper"
"Realm"不支持继承,所以我必须这样制作模型:
class Model1 : Object, Mappable
class Model2 : Object, Mappable
我想创建一个函数来查找具有字符串和主键中模型名称的本地数据。
func fetchLocal(name : String, key : String)->Object{
switch(name){
case "Model1":
~~~~
return Model1
case "Model2":
~~~~
return Model2
}
}
并且当我使用这个函数时,将对象转换为 Mappable
if let mappable = fetchLocal(name : "Model1", key: "~~~~") as? Mappable{
let json = mappable.toJSON()
}
然后 运行 出现时间错误,没有消息,如:
Thread 1: EXC_BAD_ACCESS (code = 1, address = 0x0)
我跟踪了这个错误,但应用程序在 Mappable.swift 中崩溃了:
public func toJSON() -> [String: Any] {
return Mapper().toJSON(self) <------here
}
我认为原因是函数 "fetchLocal" 只是 return "Object" 而不是 "Mappable",但是 returning class 显然是实现"Mappable",所以它通过了"if let as"子句,但是调用"toJSON()"时出错。
由于"Realm Object"无法实现,所以我不能像"ObjectMappable : Object, Mappable"那样做一个class,让"fetchLocal"函数变成return"ObjectMappable"
所以,我认为唯一的选择是使 "fetchLocal" 函数成为 return 实现 "Object and Mappable" 的 class,但我不知道如何实现。
请帮帮我。
public class Model: Object, Mappable {
public required init(map: Map) {
super.init()
}
required public init() {
super.init()
}
required public init(realm: RLMRealm, schema: RLMObjectSchema) {
super.init(realm: realm, schema: schema)
}
required public init(value: Any, schema: RLMSchema) {
super.init(value: value, schema: schema)
}
public override init(value: Any) {
super.init(value: value)
}
public func mapping(map: Map) {
}
}
领域查询
func fetchLocal<AnyModel: Model>( type: AnyModel.Type, key: String ) -> AnyModel {
yourRealm.object(ofType: type, forPrimaryKey: key)
}
任何模型
class Model1 : Model {
}
select
let m:Model1? = fetchLocal(type: Model1.self, key: "1")
我在 swift
中使用 "Realm" 和 "ObjectMapper""Realm"不支持继承,所以我必须这样制作模型:
class Model1 : Object, Mappable
class Model2 : Object, Mappable
我想创建一个函数来查找具有字符串和主键中模型名称的本地数据。
func fetchLocal(name : String, key : String)->Object{
switch(name){
case "Model1":
~~~~
return Model1
case "Model2":
~~~~
return Model2
}
}
并且当我使用这个函数时,将对象转换为 Mappable
if let mappable = fetchLocal(name : "Model1", key: "~~~~") as? Mappable{
let json = mappable.toJSON()
}
然后 运行 出现时间错误,没有消息,如:
Thread 1: EXC_BAD_ACCESS (code = 1, address = 0x0)
我跟踪了这个错误,但应用程序在 Mappable.swift 中崩溃了:
public func toJSON() -> [String: Any] {
return Mapper().toJSON(self) <------here
}
我认为原因是函数 "fetchLocal" 只是 return "Object" 而不是 "Mappable",但是 returning class 显然是实现"Mappable",所以它通过了"if let as"子句,但是调用"toJSON()"时出错。
由于"Realm Object"无法实现,所以我不能像"ObjectMappable : Object, Mappable"那样做一个class,让"fetchLocal"函数变成return"ObjectMappable"
所以,我认为唯一的选择是使 "fetchLocal" 函数成为 return 实现 "Object and Mappable" 的 class,但我不知道如何实现。
请帮帮我。
public class Model: Object, Mappable {
public required init(map: Map) {
super.init()
}
required public init() {
super.init()
}
required public init(realm: RLMRealm, schema: RLMObjectSchema) {
super.init(realm: realm, schema: schema)
}
required public init(value: Any, schema: RLMSchema) {
super.init(value: value, schema: schema)
}
public override init(value: Any) {
super.init(value: value)
}
public func mapping(map: Map) {
}
}
领域查询
func fetchLocal<AnyModel: Model>( type: AnyModel.Type, key: String ) -> AnyModel {
yourRealm.object(ofType: type, forPrimaryKey: key)
}
任何模型
class Model1 : Model {
}
select
let m:Model1? = fetchLocal(type: Model1.self, key: "1")