使用领域和对象映射器的通用函数定义 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 不能被推断为对象和可映射。
我正在使用 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 不能被推断为对象和可映射。