领域:结果<t> als List <t>

时间:2015-10-27 09:21:15

标签: ios swift realm

是否可以将Results<T>转换为List<T>或者我不应该这样做?

在我的情况下,我有将List作为参数的方法。我想用获取的对象(Results<T>)和计算对象(List<T>

调用此方法

4 个答案:

答案 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)

ResultsList实施CollectionTypeRealmCollectionType。后者是前一种协议的专业化,它允许您有效地使用聚合函数和过滤器&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)