在Swift 4中使用reduce将条件与数组连接

时间:2018-08-27 00:09:40

标签: swift swift4

我一直在寻找一种方法来正确使用Array类的 reduce 方法,但是找不到它。如何缩短这段代码?

guard let selectedPlanets = self.chart.houses.first(where: {"house_\($0.houseId)" == id})?.planets else { return }

var selectedDestinations: [String] = []
for selectedPlanet in selectedPlanets {
    selectedDestinations += (self.myAspectDestination[selectedPlanet.name] ?? [])
}

1 个答案:

答案 0 :(得分:0)

您需要拥有first。然后,您可以map生成的数组来获取数组数组。然后,您最终可以使用reduce来组合这些数组。

let selectedDestinations = self.chart.houses
    .first(where: {"house_\($0.houseId)" == id})?.planets
    .compactMap { self.myAspectDestination[$0.name] }
    .reduce([], +)

使用compactMap代替map减轻了使用?? []

的需要

selecteDestinations将是[String]?。如果nil失败,它将为first。如果想在?? []失败的情况下使用空数组,可以在末尾添加first