领域:结果<T> 与列表<T>

Realm: Results<T> als List<T>

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

在我的例子中,我有一个将 List 作为参数的方法。我想用获取的对象 (Results<T>) 和计算的对象 (List<T>)

调用此方法

Results 实现了 CollectionType 协议,所以你可以使用 reduce 来转换它:

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

您可以将此代码放在扩展名中,或者按照您喜欢的方式。

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

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

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

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

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)

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