使用领域和对象映射器的通用函数定义 swift 扩展

Defining swift extensions with generic functions for realm and object mapper

我正在使用 Realm 和 ObjectMapper,我想创建一些扩展,以便在将一些数据备份到 JSON 时让我的生活更轻松。我定义了以下扩展:

extension Mappable where Self:Object {
    func getCompleteJSONDictionary() throws -> [String: Any]? {
        var returnValue: [String: Any]?

        if self.isManaged, let realm = self.realm, !realm.isInWriteTransaction {
            try realm.write {
                var data = self.toJSON()
                data["id"] = self.getPrimaryKeyValue()
                returnValue = data
            }
        } else {
            var data = self.toJSON()
            data["id"] = self.getPrimaryKeyValue()
            returnValue = data
        }

        return returnValue

    }
}

extension Results where Element:Object, Element:Mappable {

    func getAllCompleteJSONDictionaries() throws -> Array<[String:Any]>? {
        var array: Array<[String:Any]> = Array()
        for element in self {
            if let dictionary = try? element.getCompleteJSONDictionary(), let data = dictionary {
                 array.append(data)
            }
        }

        if array.count > 0 {
            return array
        } else {
            return nil
        }
    }
}

extension Realm {

func getJSONBackupData<T>(forTypes types: [T.Type]) throws -> [String: Any] where T:Object, T:Mappable {

    var data: [String: Any] = [:]

    try self.write {
        for type in types {
            let entities = self.objects(type)
            if let entityJsonData = try entities.getAllCompleteJSONDictionaries() {
                data[String(describing: type)] = entityJsonData
            }

        }
    }

    return data
}

}

前两个扩展工作正常,但当我尝试使用最后一个时,国家 class 同时符合 Object 和 Mappable:

var finalData = realm.getJSONBackupData(forTypes:[Country.self])

我收到无法推断 T 的错误。当谈到 Swift 中的泛型时,我仍然无可救药地弄糊涂了,所以我猜我只是没有正确理解问题。这里有一个简单的修复方法还是我对编译器的要求太多了?

问题是领域对象不符合可映射协议。所以国家对象是不可映射的,因此编译器说类型 Country.self 不能被推断为对象和可映射。