我有一个自定义对象“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

07-28 04:13
查看更多