是否可以将Results<T>
转换为List<T>
或者我不应该这样做?
在我的情况下,我有将List作为参数的方法。我想用获取的对象(Results<T>
)和计算对象(List<T>
)
答案 0 :(得分:19)
CollectionType
实施了reduce
协议,因此您可以使用let results: Results<MyObject> = ...
let converted = results.reduce(List<MyObject>()) { (list, element) -> List<MyObject> in
list.append(element)
return list
}
进行转换:
private static String capitalize(String str) {
char[] chars = str.toCharArray();
String caps = chars[0]+"";
caps = caps.toUpperCase();
String output = caps;
for(int i=1;i<chars.length;i++) {
output = output + chars[i];
}
return output;
}
您可以将此代码放在扩展程序中,也可以随意使用。
答案 1 :(得分:4)
Results
和List
实施CollectionType
和RealmCollectionType
。后者是前一种协议的专业化,它允许您有效地使用聚合函数和过滤器&amp;排序条目。
Realm Swift中几乎没有任何方法对集合的类型做出强有力的假设。他们只期望SequenceType
这是前者CollectionType
的概括。对于您自己的方法,我建议采用相同的方法。您可以通过声明如下所示来达到目的。
func foo<T, S: SequenceType where S.Generator.Element == T>(objects: S) { … }
答案 2 :(得分:1)
我将使用计算变量为 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
答案 3 :(得分:0)
我们可以使用扩展程序来简化生活:
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)