使用领域和对象映射器的通用功能定义快速扩展

时间:2018-06-26 09:37:37

标签: swift realm objectmapper

我正在使用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
}

}

前两个扩展正常工作,但是一旦我尝试使用后一个扩展,国家/地区类就同时符合Object和Mappable:

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

我收到一个错误,无法推断T。对于Swift中的泛型,我仍然感到困惑,所以我猜测我只是没有正确理解问题。这里有一个简单的解决方法,还是我问了太多的编译器?

1 个答案:

答案 0 :(得分:0)

问题在于,领域对象不符合可映射协议。因此Country对象不是Mappable,因此编译器说不能将Country.self类型推断为Object和Mappable。