Swift: ярлык для развертывания массива опций
Предположим, что у нас есть массив определенных опций:
var arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]
Я могу заставить его развернуть его коротко: var arrayForCrash = arrayOfOptionals.map { $0! }
Но это приведет к сбою приложения, есть ли какой-либо другой короткий способ (без явной разворачивания), как я могу развернуть массив необязательных?
Ответы
Ответ 1
Это решение даст вам новый массив со всеми развёрнутыми значениями и все отфильтрованные.
Swift 4.1:
let arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]
let arrayWithNoOptionals = arrayOfOptionals.compactMap { $0 }
Swift 2.0:
let arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]
let arrayWithNoOptionals = arrayOfOptionals.flatMap { $0 }
Swift 1.0:
let arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]
let arrayWithNoOptionals = arrayOfOptionals.filter { $0 != nil }.map { $0! }
Ответ 2
Так как это массив опций, возможно, некоторые из записей nil
. Вместо развертывания силы с помощью !
используйте оператор объединения nil, чтобы превратить nil
в пустые строки.
let arrayOfOptionals: [String?] = ["This", "array", nil, "has", "some", "nils", nil]
let array:[String] = arrayOfOptionals.map{ $0 ?? "" }
// array is now ["This", "array", "", "has", "some", "nils", ""]
Ответ 3
Хотя вы можете использовать flatMap { $0 }
для удаления nils, flatMap на самом деле является гораздо более мощной функцией и имеет перегруженную версию, которая делает что-то совершенно другое (например, flatten [[Int]]
to [Int]
). Если вы не будете осторожны, вы можете случайно вызвать неправильную функцию.
Я бы рекомендовал использовать расширение для SequenceType для удаления nils. Если вы используете removeNils()
, вы сможете сделать следующее:
[1, nil, 2].removeNils() == [1, 2]
Это работает, делая Optional
соответствовать протоколу OptionalType
, который позволяет расширять SequenceType
, которые содержат значения Optional
.
Для получения дополнительной информации см. исходный ответ который я опубликовал.
Ответ 4
Я взял ответ @Cenny и решил сделать из него оператора:
prefix operator <!> {}
prefix func <!> <T>(array: [T?]) -> [T] {
return array.filter{ $0 != nil }.map{ $0! }
}
Я использую его для анализа массива объектов JSON и фильтрации тех, которые не удалось:
static func parse(j: JSONArray) -> [Agency]? {
return <!>j.map { self.parse($0) }
}
Обновление для Swift 2+:
Используйте оператор flatMap
, и он будет возвращать объекты, отличные от нуля,
Ответ 5
Как насчет:
import Foundation
var test: [String!] = ["this","is","a",nil,"test"]
for string in test {
if string != nil {
print(string)
}
}
Вывод thisisatest
.
В вашем случае используйте [String!]
, если я правильно вас понял.