我有一个自定义对象“Foo”数组。
每个“Foo”都有一个可选的“Bar”数组。
我知道我可以用for循环来实现,但我希望有一种更优雅的方法,可能使用flatMap、filter和/或reduce。
Foo可以有更多不同类型的属性。
class Foo {
var bars: [Bar]?
}
let foo1 = Foo()
let foo2 = Foo()
let foo3 = Foo()
let bar1 = Bar()
let bar2 = Bar()
let bar3 = Bar()
foo1.bars.append(bar2)
foo1.bars.append(bar3)
foo2.bars.append(bar1)
foo2.bars.append(bar2)
foo2.bars.append(bar3)
foo3.bars.append(bar1)
foo3.bars.append(bar2)
let FooArray = [Foo1, Foo2, Foo3]
// Magic -> Print 7
最佳答案
您可以使用Array.reduce
let count = FooArray.reduce(0) { $0 + ($1.bars?.count ?? 0) }
把这个贴在操场上
class Bar {
}
class Foo {
var bars: [Bar]?
func appendBar(_ bar: Bar) {
if self.bars == nil {
self.bars = [bar]
} else {
self.bars!.append(bar)
}
}
}
let foo1 = Foo()
let foo2 = Foo()
let foo3 = Foo()
let bar1 = Bar()
let bar2 = Bar()
let bar3 = Bar()
foo1.appendBar(bar2)
foo1.appendBar(bar3)
foo2.appendBar(bar1)
foo2.appendBar(bar2)
foo2.appendBar(bar3)
foo3.appendBar(bar1)
foo3.appendBar(bar2)
let FooArray = [foo1, foo2, foo3]
let count = FooArray.reduce(0) { $0 + ($1.bars?.count ?? 0) }
print(count) // Output: 7