【问题标题】:Convert Swift Array of Realm Objects Back to Realm Results将领域对象的 Swift 数组转换回领域结果
【发布时间】:2016-10-21 20:55:19
【问题描述】:

我有一个 Entry 类,其中有一个 FieldValue 对象列表:

class Entry: Object{
  let fieldValues = List<FieldValue>()
  //...
}

class FieldValue: Object{
  dynamic var total = 0
  //...
}

我对查询中的一些条目进行了一系列过滤,如下所示:

var entryObjects = realm.objects(Entry.self).filter(...)

我现在想要sum total 值,用于所有fieldValues 仍然存在于我过滤的entryObjects 中。因此,如果我遍历所有条目,我可以构建一个 FieldValue 对象数组,如下所示:

var fieldValues = [FieldValue]()
for entry in entryObjects{
  fieldValues += entry.fieldValues  
}

我现在有 fieldValues 类型的 [FieldValue]。但是为了在其total 属性上执行sum,它必须是Results&lt;FieldValue&gt; 类型:

let total:Int = fieldValues.sum(ofProperty: "total") <-- /// Error! ///

如何将我的[FieldValue] 数组转换回Results&lt;FieldValue&gt;,以便对其进行聚合操作?

【问题讨论】:

    标签: swift3 realm


    【解决方案1】:

    这样做:

    let entryObjects = realm.objects(Entry.self).filter(...)
    let total = entryObjects.map({ $0.fieldValues.sum(ofProperty: "total") }).reduce(0, +)
    

    当 Realm 支持嵌套键路径 (#3392) 上的聚合操作时,可以为此使用 KVC,但这仍在进行中。

    【讨论】:

    • 很好的答案,谢谢。我最终以类似的方式使用了reduce,但这比我想出的代码还要少。