首页 > 解决方案 > Swift:过滤嵌套数组

问题描述

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

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?
}

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

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) }}

}

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

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

标签: iosswiftfunctional-programming

解决方案


按照@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 }
    }

推荐阅读