我有一个
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()
}
}
稍微优雅一些(在我看来)是使用高阶函数,如下所示:
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() })
}
您可以将用于对 CoreData 一对多关系建模的
NSSet
转换为数组:
let serviceItems: [ServiceItem] = (myServiceGroup.items?.allObjects as? [ServiceItem]) ?? []
此后,您可以使用常规的
forEach()
、map()
或 reduce()
操作。