Swift-获取自定义对象数组中所有数组的计数

时间:2019-04-02 16:08:10

标签: arrays swift

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

3 个答案:

答案 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 }