【问题标题】:How can I convert LazyFilterSequence<Results<Element>> to type Results<Element>如何将 LazyFilterSequence<Results<Element>> 转换为类型 Results<Element>
【发布时间】:2020-07-07 12:19:37
【问题描述】:

我有一个过滤的领域对象,它返回LazyFilterSequence&lt;Results&lt;Element&gt;&gt;。我需要将其用作Results&lt;Element&gt;。 有什么办法可以转换。为什么它返回 LazyFilterSequence。

items 对象类型为Results&lt;Element&gt;,filterList 对象类型为Object

let filters = filterList.menuOptions
        .compactMap { $0.isSelected ? NSPredicate(format: "\($0.filter) == 1") : nil }
    
let filtered = items.filter { item in
        //check whether item matches all filters
    if Array(filters).contains(where: { !$0.evaluate(with: item) }) {
        return false
    } else {
        return true
    }
}

【问题讨论】:

    标签: swift collections realm


    【解决方案1】:

    你不能。 Results 不能手动实例化,因为它是一个自动更新的集合,只能通过 Realm 查询来实例化。

    如果您需要 Results 的自动更新特性,则需要使用 Realm 的 filter。如果 Realm 的过滤器不适合您的需求,因此您需要使用 Swift 的基于闭包的 filter,那么您需要牺牲 Results 的自动更新特性,并在每次原始 Results 时手动重新运行过滤器更新了。

    【讨论】:

      【解决方案2】:

      @dávid-pásztor 是对的 - 这是不可能的。

      您需要使用带有谓词的过滤器来获取结果。

      例如:

      let predicates: [NSPredicate] = filterList.menuOptions
          .filter { $0.isSelected }
          .map { NSPredicate(format: "\($0.filter) == 1") }
      let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates)
      let filtered = items.filter(predicate)
      

      【讨论】:

      • 请原谅,这段代码有效吗?假设 filterList.menuOptions 是一个数组。我相信,一旦你在 Realm Collection 上实现了 Swift 过滤.filter { $0.isSelected },它就会断开对象与 Realm 的连接,并且不会产生 Results 对象。但是,我可能读错了......
      • 似乎filterList.menuOptions 是简单的数组,所以我们可以使用简单的Swift 过滤器。但是.filter(predicate) 是用于领域集合的。
      猜你喜欢
      • 2021-08-22
      • 2018-06-15
      • 1970-01-01
      • 2023-03-18
      • 2012-11-26
      • 1970-01-01
      • 2021-08-04
      • 2023-02-09
      • 2015-05-06
      相关资源
      最近更新 更多