首页 > 解决方案 > 数组中的 Swift 数组。使用 compactMap / map 而不是嵌套循环

问题描述

我正在尝试创建一个方法的功能实现,该方法迭代具有嵌套循环的数组数组......非常不灵活。

新实现用于compactMap展平嵌套数组并map创建对象。

这是我得到的代码。我快到了,但还没有:

if !activeDeals.isEmpty {
    let carSelectionViewItems: [CarSelectionViewItem] = activeDeals
            .compactMap { $0.bookings }
            .map {
                let make = $0.vehicle?.make ?? ""
                let model = $0.vehicle?.model ?? ""
                let title = "\(make) \(model)"

                return CarSelectionViewItem(icon: $0.vehicle?.carImage ?? "",
                                                title: title,
                                                description: String(format: "car_pending_booked_description".locale,
                                                                    getNewDateStringFormat(string: $0.startDate)),
                                                bookingStatus: .active,
                                                dealStatus: .won,
                                                dealId: $0.id ?? "",
                                                showMoreFunc: {})
            }

    viewItems.append(contentsOf: carSelectionViewItems)
}

我想完成每个预订并创建一个CarSelectionViewItem对象,然后append将其用于viewItems.

模型的一些细节:

public struct Deal: Decodable {
    public let id: String?
    // ...
    public let bookings: [Booking]?
}

public struct Booking: Decodable {
    public let id: String?
    // ...
    public let startDate: String?
    public let vehicle: Vehicle?
}

public struct Vehicle: Decodable{
    public let id: String?
    public let licensePlate: String?
    public let make: String?
    public let model: String?
    public let version: String?
    public let ps: Double?
    public let kw: Double?
    public let fuelType: String?
    public let gearingType: String?
    public let carImage: String?
    public let manuals: String?
}

一个数组Deal。每笔交易都有不同的属性(id、时间戳等)和一个数组Booking

[Deal1, Deal2, Deal3]

更深一层:

[[Booking1, Booking2], [Booking1, Booking2, Booking3], [Booking1]]

最终解决方案

if !activeDeals.isEmpty {
    viewItems.append(BannerViewItem(slogan: "my_car_active_request".locale.uppercased(), banner: nil))

    let carSelectionViewItem: [CarSelectionViewItem] = activeDeals
        .compactMap { $0.bookings }
        .flatMap { $0 }
        .map {
            let make = $0.vehicle?.make ?? ""
            let model = $0.vehicle?.model ?? ""
            let title = "\(make) \(model)"

            return CarSelectionViewItem(icon: $0.vehicle?.carImage ?? "",
                                        title: title,
                                        description: String(format: "car_pending_booked_description".locale,
                                                            getNewDateStringFormat(string: $0.startDate)),
                                        bookingStatus: .active,
                                        dealStatus: .won,
                                        dealId: $0.id ?? "",
                                        showMoreFunc: {})
    }

    viewItems.append(contentsOf: carSelectionViewItem)
}

标签: iosarraysswiftfunctional-programming

解决方案


我终于做对了:

if !activeDeals.isEmpty {

    let bookings = activeDeals
        .map { $0.bookings } // Gets the arrays of bookings
        .compactMap { $0 }   // Gets rid of the nils
        .flatMap { $0 }      // Flattens it

    let carSelectionViewItem: [CarSelectionViewItem] = bookings.map {
        let make = $0.vehicle?.make ?? ""
        let model = $0.vehicle?.model ?? ""
        let title = "\(make) \(model)"

        return CarSelectionViewItem(icon: $0.vehicle?.carImage ?? "",
                                            title: title,
                                            description: String(format: "car_pending_booked_description".locale,
                                                                getNewDateStringFormat(string: $0.startDate)),
                                            bookingStatus: .active,
                                            dealStatus: .won,
                                            dealId: $0.id ?? "",
                                            showMoreFunc: {})
    }

    viewItems.append(contentsOf: carSelectionViewItem)
}

推荐阅读