【问题标题】:Realm: Results<T> als List<T>领域:Results<T> 也就是 List<T>
【发布时间】:2015-10-27 09:21:15
【问题描述】:

是否可以将Results&lt;T&gt; 转换为List&lt;T&gt; 或者我不应该这样做吗?

在我的例子中,我有一个以 List 作为参数的方法。我想用获取的对象(Results&lt;T&gt;)和计算的对象(List&lt;T&gt;)调用这个方法

【问题讨论】:

  • 你能利用他们都是RealmCollectionType这个事实吗?

标签: ios swift realm


【解决方案1】:

Results 实现了CollectionType 协议,因此您可以使用reduce 对其进行转换:

let results: Results<MyObject> = ...
let converted = results.reduce(List<MyObject>()) { (list, element) -> List<MyObject> in
    list.append(element)
    return list
}

您可以将此代码放在扩展程序中或您喜欢的任何地方。

【讨论】:

    【解决方案2】:

    ResultsList 实现 CollectionTypeRealmCollectionType。后者是前者协议的特化,它允许您有效地使用聚合函数以及过滤和排序条目。

    Realm Swift 中几乎没有任何方法对集合的类型做出强有力的假设。他们只期望SequenceType 是前CollectionType 的概括。对于您自己的方法,我建议您采用相同的方法。您可以通过如下所示声明它来实现它。

    func foo<T, S: SequenceType where S.Generator.Element == T>(objects: S) { … }
    

    【讨论】:

      【解决方案3】:

      我会使用计算变量为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
      

      【讨论】:

        【解决方案4】:

        我们可以使用扩展来让生活更轻松:

        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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-27
          • 1970-01-01
          相关资源
          最近更新 更多