从子数组中获取单个项目的快速功能方式



我有以下函数(示例(,我想以函数式方式编写:

func passengerForId(_ id: Int) -> Passenger?
{
for car in cars
{
for passenger in car.passengers
{
if passenger.id == id
{
return passenger
}
}
}
return nil
}

最好的方法是什么?

我尝试了以下方法:

func passengerForId(_ id: Int) -> Passenger?
{
return cars.first(where: { $0.passengers.contains(where: { $0.id == id } ) })
}

但是,这显然返回的是包含所请求乘客的汽车,而不是乘客本身。

另一种选择是这样的:

func passengerForId(_ id: Int) -> Passenger?
{
let passengers = cars.flatMap { car in car.passengers }
return passengers.first(where: { $0.id == id })
}

func passengerForId(_ id: Int) -> Passenger?
{
return cars.flatMap { car in car.passsengers.filter { $0.id == id }}.first
}

但是,这似乎不如原始效率低,因为它将遍历所有区域。

有没有更好的方法可以做到这一点?

您可以创建所有乘客的(懒惰(扁平集合,然后选择 第一个匹配的:

func passengerForId(_ id: Int) -> Passenger? {
return cars.lazy.flatMap({ $0.passengers }).first(where: { $0.id == id } )
}

最新更新