我有一个以下代码,它复制一个Rider对象数组,并附加一个新的Rider对象(如果存在)。
let riders:[Rider] = getRiders()
let newRider:Rider? = mayGetNewRider()
var ridersPlus = riders
if let rider = newRider {
ridersPlus.append(rider)
}
我正在寻找一种更好(更简单,更容易阅读)的方式来编写这种逻辑,这也允许我将ridersPlus定义为“let”变量。
我正在寻找下面的东西(这是无效的,因为我编写了???语法,它产生一个空的newRider数组是nil)。
let riders:[Rider] = getRiders()
let newRider:Rider? = mayGetNewRider()
let ridersPlus = riders + [newRider???]
怎么样
let ridersPlus = riders + [newRider].compactMap {$0}
(请注意,在Swift 4之前,compactMap
将被称为flatMap
。你没有说明你正在使用的Swift版本。)
你用map
和nil合并算子??
做到这一点:
let ridersPlus = riders + (newRider.map {[$0]} ?? [])
调用Optional值时,map
在Optional实例不是nil
时评估给定的闭包,将未包装的值作为参数传递。如果Optional是nil
,map
的结果是nil
。将其与nil合并运算符组合,生成的Optional数组可以打开或用[]
替换,然后添加到riders
数组中。