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")