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

问题描述 投票:0回答:3

我有一个

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

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

有人有建议,这样我就不必不断地案例/胁迫我的关系实体吗?

if let items = self.items {
    for case let item as ServiceItem in items {
        mins += item.calculateTotalMinutes()
    }
}
ios swift core-data swift4
3个回答
2
投票

稍微优雅一些(在我看来)是使用高阶函数,如下所示:

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

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

0
投票

您可以将用于对 CoreData 一对多关系建模的

NSSet
转换为数组:

let serviceItems: [ServiceItem] = (myServiceGroup.items?.allObjects as? [ServiceItem]) ?? []

此后,您可以使用常规的

forEach()
map()
reduce()
操作。

© www.soinside.com 2019 - 2024. All rights reserved.