我正在为泛型领域编写一个类,我已经在Kotlin中完成了,现在我尝试将其转换为swift,但是它更加复杂,因为swift似乎不如Kotlin灵活
有效的科特林代码:
inline fun <reified T : RealmModel> fetch(sortedBy: String,
ascending: Boolean = true,
noinline predicate: Query<T>? = null,
completion: (error: RealmFileException?, results: List<T>?) -> Unit) {
val sort = if (ascending) {
Sort.ASCENDING
} else {
Sort.DESCENDING
}
try {
val results: List<T> = if (predicate != null) {
realm.where(T::class.java).predicate().sort(sortedBy, sort).findAll()
} else {
realm.where(T::class.java).sort(sortedBy, sort).findAll()
}
completion(null, results)
Log.s("Successfully retrieve data (size: ${results.size}): $results")
} catch (e: RealmFileException) {
Log.e("ERROR: ${e.localizedMessage}")
completion(e, null)
}
}
上面的代码很完美。
现在这是我的 Swift 代码:
func fetch(object: Object.Type,
predicate: NSPredicate?,
sortedBy: String, ascending: Bool,
completion: (_ error: Error?, _ results: [Object]?) -> ()) {
do {
let realm = try Realm()
let objects: Results<Object>!
if let predicate = predicate {
objects = realm.objects(object).filter(predicate).sorted(byKeyPath: sortedBy, ascending: ascending)
} else {
objects = realm.objects(object).sorted(byKeyPath: sortedBy, ascending: ascending)
}
let objectsArray = Array(objects)
Log.s("Successfully retrieve data (size: \(objectsArray.count): $results")
completion(nil, objectsArray)
} catch let error {
Log.e("ERROR: \(error.localizedDescription)")
completion(error, nil)
}
}
问题是,在我的快速代码中,以下是我当前在完成代码块中返回的Object类型的列表
那不适合我,我希望能够像在kotlin中那样给他一个T型,并像下面这样完整地返回一个T型列表:
func get<T: Object>(completion: (_list: [T]) -> ()){
...
let results = realmResults as T
completion(results)
}
但是我有几个问题:
1-我无法创建这样的领域对象:realm.objects(T.type)
或realm.objects(T.self)
,但出现错误。
2-我无法将像此[Object]这样的列表转换为[T]
'[Object]' is not convertible to '[T]'; did you mean to use 'as!' to force downcast?
3-当我想调用像这样的函数get<Customer>{ results in }
cannot explicitly specialize a generic function
不起作用。使我的函数通用的方法是什么?
答案 0 :(得分:2)
首先,将方法声明更改为当前的Swift语法
func get<T: Object>(completion: ([T]) -> Void) {
// ...
}
接下来,如果您在T
方法的闭包中指定了这种类型,则编译器可以推断出get
的类型
get { (customers: [Customer]) -> Void in
// ... work with `customers`
}
这样您就可以在方法中使用
let results: Results<T>