优雅地在swift中迭代CoreData关系?

时间:2017-12-05 00:58:34

标签: ios swift core-data swift4

我的ServiceGroup实体与ServiceItem的{​​{1}}有一对多关系,名为items。我想迭代items但是swift似乎完全不知道变量类型,因为items只是被定义为NSOrderedSet?

我发现能够迭代我的项目的唯一方法是我必须使用最近添加到for循环的新案例语法来强制转换它们,但这似乎很荒谬,因为代码 - 应该 - 知道什么类型已经。

任何人都有建议,以便我不必经常判断/胁迫我的关系实体吗?

if let items = self.items {
    for case let item as ServiceItem in items {
        mins += item.calculateTotalMinutes()
    }
}

2 个答案:

答案 0 :(得分:1)

稍微优雅一点(在我看来)会使用更高阶的函数,如下所示:

let minutes = items
        .map({$0 as? ServiceItem})
        .flatMap({$0})
        .reduce(0) { (result, serviceItem) -> Double in
            return result + serviceItem.calculateTotalMinutes()
    }

答案 1 :(得分:0)

NSOrderedSet有一个属性array来获取支持数组。当属性返回[Any]时,您必须转换类型。为方便起见,您可以使用forEach

if let items = self.items {
    (items.array as! [ServiceItem]).forEach {
        mins += $0.calculateTotalMinutes()
    }
}

reduce

if let items = self.items {
    mins = (items.array as! [ServiceItem]).reduce(mins, { $0 + $1.calculateTotalMinutes() })
}