Лучший способ справиться с необязательной переменной и операцией с массивом в Swift - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть следующий код, который копирует массив объектов Rider и добавляет новый объект Rider, если он существует.

let riders:[Rider] = getRiders()
let newRider:Rider? = mayGetNewRider()
var ridersPlus = riders
if let rider = newRider {
   ridersPlus.append(rider)
}

Я ищу лучший (более простой и легкий для чтения) способ написания этой логики, который также позволяет мне определять ridersPlus как переменную let.

Я ищу что-то подобное ниже (что недопустимо, потому что я создал синтаксис ???, который выдает пустой массив newRider is nil).

let riders:[Rider] = getRiders()
let newRider:Rider? = mayGetNewRider()
let ridersPlus = riders + [newRider???]

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы делаете это с map и оператором объединения nil ??:

let ridersPlus = riders + (newRider.map {[$0]} ?? [])

map при вызове Необязательное значение оцениваетданное закрытие, когда Необязательный экземпляр не является nil, передавая развернутое значение в качестве параметра.Если Необязательный равен nil, результат map равен nil.Комбинируя это с оператором nil коалесцирующий , полученный необязательный массив можно развернуть или заменить на [], а затем добавить в массив riders.

0 голосов
/ 18 сентября 2018

Как насчет

let ridersPlus = riders + [newRider].compactMap {$0}

(Обратите внимание, что до Swift 4 compactMap назывался flatMap. Вы не сказали, какую версию Swift вы используете.)

...