【发布时间】:2015-10-27 09:21:15
【问题描述】:
是否可以将Results<T> 转换为List<T> 或者我不应该这样做吗?
在我的例子中,我有一个以 List 作为参数的方法。我想用获取的对象(Results<T>)和计算的对象(List<T>)调用这个方法
【问题讨论】:
-
你能利用他们都是
RealmCollectionType这个事实吗?
是否可以将Results<T> 转换为List<T> 或者我不应该这样做吗?
在我的例子中,我有一个以 List 作为参数的方法。我想用获取的对象(Results<T>)和计算的对象(List<T>)调用这个方法
【问题讨论】:
RealmCollectionType这个事实吗?
Results 实现了CollectionType 协议,因此您可以使用reduce 对其进行转换:
let results: Results<MyObject> = ...
let converted = results.reduce(List<MyObject>()) { (list, element) -> List<MyObject> in
list.append(element)
return list
}
您可以将此代码放在扩展程序中或您喜欢的任何地方。
【讨论】:
Results 和 List 实现 CollectionType 和 RealmCollectionType。后者是前者协议的特化,它允许您有效地使用聚合函数以及过滤和排序条目。
Realm Swift 中几乎没有任何方法对集合的类型做出强有力的假设。他们只期望SequenceType 是前CollectionType 的概括。对于您自己的方法,我建议您采用相同的方法。您可以通过如下所示声明它来实现它。
func foo<T, S: SequenceType where S.Generator.Element == T>(objects: S) { … }
【讨论】:
我会使用计算变量为Results 创建一个扩展:
extension Results {
var list: List<Element> {
reduce(.init()) { list, element in
list.append(element)
return list
}
}
}
那么你可以这样使用它:
// results is a variable of type Results<SomeElement>
let list = results.list
【讨论】:
我们可以使用扩展来让生活更轻松:
extension Realm {
func list<T: Object>(_ type: T.Type) -> List<T> {
let objects = self.objects(type)
let list = objects.reduce(List<T>()) { list, element -> List<T> in
list.append(element)
return list
}
return list
}
}
用法:
let objects = realm.list(YourObject.self)
【讨论】: