ios - 数组中的 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)
}
解决方案
我终于做对了:
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)
}
推荐阅读
- django - django-allauth 和 docker 闪烁的 Facebook 登录弹出窗口
- dart - 使用偏移量的容器动画 - Flutter
- c# - WPF 使用重置对 DataGrid 进行排序
- ibm-watson - IBM Chatbot 助手的覆盖日志 URL 是什么?
- node.js - 使用 NGINX 和 Nodejs 反向代理服务快速动态 URL
- pandas - 使用 pip 安装程序的 pandas 安装错误
- unity3d - 无法统一构建:“UnityEditor.BuildPlayerWindow+BuildMethodException:”
- c# - 如何在 asp.net 中设置反应环境?
- go - 在 Golang 中使用函数生成地图
- php - 在 php 中插入日期时添加 # 不起作用