Я работаю с 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, так что, полагаю, я не совсем правильно понимаю проблему. Здесь легко исправить или я слишком много спросил у компилятора?