从子阵列获取单个项目的Swift功能方式

Fre*_*ers 0 functional-programming swift

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

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

什么是最好的方式?

我尝试过以下方法:

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

然而,这显然会使包含所请求乘客的车辆返回,而不是乘客本身.

另一个选择是:

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

要么

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

然而,这似乎比原始效率低,因为它将循环遍及所有区域.

有一个更好的方法吗?

Mar*_*n R 7

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

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