gmo*_*eda -2 arrays functional-programming ios swift
我正在尝试创建一个方法的功能实现,该方法使用嵌套循环迭代数组数组......非常不迅速。
新的实现用于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)
}
Run Code Online (Sandbox Code Playgroud)
我想完成每个预订并创建一个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?
}
Run Code Online (Sandbox Code Playgroud)
一个数组Deal。每笔交易都有不同的属性(id、时间戳等)和一个数组Booking:
[Deal1, Deal2, Deal3]
Run Code Online (Sandbox Code Playgroud)
更深一层:
[[Booking1, Booking2], [Booking1, Booking2, Booking3], [Booking1]]
Run Code Online (Sandbox Code Playgroud)
最终解决方案
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)
}
Run Code Online (Sandbox Code Playgroud)
我终于猜对了:
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)
}
Run Code Online (Sandbox Code Playgroud)