我有一个自定义对象“ 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
答案 0 :(得分:1)
首先,我建议您改成Foo
模型struct
并初始化为空的Array
而不是声明可选数组
struct Bar {}
struct Foo {
var bars = [Bar]()
}
然后,您可以使用reduce
。将每个bars
的{{1}}数组内的元素数量相加。
Foo
let count = fooArray.reduce(0) { $0 + $1.bars.count }
如果要将var foo1 = Foo()
var foo2 = Foo()
var foo3 = Foo()
foo1.bars = [Bar(),Bar()]
foo2.bars = [Bar(),Bar(),Bar()]
foo3.bars = [Bar(),Bar()]
let fooArray = [foo1, foo2, foo3]
let count = fooArray.reduce(0) { $0 + $1.bars.count }
print(count) // 7
的类型保留为可选数组,则只需添加bars
即可求和
0
答案 1 :(得分:1)
您可以使用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
答案 2 :(得分:0)
不需要像Robert Dresler所建议的那样更改Foo。这样就可以了:
let count = fooArray.reduce(0) { $0 + $1.bars?.count ?? 0 }