【发布时间】:2019-01-14 14:56:39
【问题描述】:
我正在尝试创建一个方法的功能实现,该方法在具有嵌套循环的数组数组上进行迭代......非常不灵活。
新实现使用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)
}
【问题讨论】:
-
请添加所有需要的代码,以便我们运行您的示例。当前代码永远不会编译
-
显示 CarSelectionViewItem 的声明
-
也许使用
Array.flatten(),然后只遍历结果数组? -
为什么要从地图主体内部附加到
viewItems(而不是作为映射该值的结果返回值)? -
booking 和 viewItems 有什么区别?如果 viewItems 已经有一些数据,您可以只映射,这会将 CarSelectionViewItems 添加到预订中,然后在循环之外执行一些操作,例如 viewItems.add(elementsOf: booking)
标签: ios arrays swift functional-programming