Подтвердить что ты не робот

Swift: ярлык для развертывания массива опций

Предположим, что у нас есть массив определенных опций:

var arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]

Я могу заставить его развернуть его коротко: var arrayForCrash = arrayOfOptionals.map { $0! }

Но это приведет к сбою приложения, есть ли какой-либо другой короткий способ (без явной разворачивания), как я могу развернуть массив необязательных?

4b9b3361

Ответ 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!], если я правильно вас понял.