优雅地迭代了Swift的Coredata关系



我有一个与ServiceItem一对多关系的ServiceGroup实体,称为items。我想迭代items,但是Swift似乎完全不知道变量类型,因为items只是将其定义为NSOrderedSet?

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

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

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

(在我看来)略微优雅的东西是使用较高的功能:

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

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() })
}

最新更新