我正在使用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中的泛型,我仍然感到困惑,所以我猜测我只是没有正确理解问题。这里有一个简单的解决方法,还是我问了太多的编译器?
答案 0 :(得分:0)
问题在于,领域对象不符合可映射协议。因此Country对象不是Mappable,因此编译器说不能将Country.self类型推断为Object和Mappable。