Определение быстрых расширений с помощью универсальных функций для области и сопоставления объектов - PullRequest
0 голосов
/ 26 июня 2018

Я работаю с 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 голосов
/ 27 июня 2018

Проблема в том, что Realm Objects не соответствует Mappable Protocol. Таким образом, Объект Country не является Mappable, и, следовательно, компилятор говорит, что Type Country.self не может быть выведен как Object и Mappable.

...