Swift:过滤嵌套数组

gmo*_*eda 0 functional-programming ios swift

我正在尝试过滤一个具有嵌套数组 的Deals状态的DealStaus数组Bookings,每个数组都有一个BookingStatus. 我想.won根据调用函数时给出的状态过滤状态和预订的交易。BookingStatus并且DealStatus都是枚举。 DealBooking像这样:

public struct Deal: Decodable {
    public let identifier: String?
    public let status: DealStatus
    public let bookings: [Booking]?
}

public struct Booking: Decodable {
    public let identifier: String?
    public let status: BookingStatus
    public let startDate: Date?
    public let endDate: Date?
}
Run Code Online (Sandbox Code Playgroud)

为此,我编写了以下代码段:

private func getDeals(with bookingStatus: [BookingStatus]) -> [Deal] {
    guard let user = currentUser, let deals = user.deals else { return [Deal]() } // Note: user is a class attribute

    return deals.filter { $0.status == .won && $0.bookings?.filter { bookingStatus.contains($0.status) }}

}
Run Code Online (Sandbox Code Playgroud)

这不起作用。编译器给出以下错误:

可选类型“[预订]?” 不能用作布尔值;改为测试 '!= nil'

gmo*_*eda 5

按照@matt 的指示,我将其分解:

private func getDeals(with bookingStatus: [BookingStatus]) -> [Deal] {
    guard let user = currentUser, let deals = user.deals else { return [Deal]() }
        return deals
            .filter { $0.status == .won }
            .filter { $0.bookings?.contains(where: { bookingStatus.contains($0.status)} ) ?? false }
    }
Run Code Online (Sandbox Code Playgroud)