Swift:快捷方式展开选项数组

amb*_*ght 36 swift

假设我们定义了一组选项:

var arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]
Run Code Online (Sandbox Code Playgroud)

我可以用一小段时间强行打开它: var arrayForCrash = arrayOfOptionals.map { $0! }

但这会让应用程序崩溃,还有其他任何简短的方法(没有明确展开)我如何解开一个可选数组?

Cen*_*nny 97

这个解决方案将为您提供一个新数组,其中所有值都被解开并且所有nil都被过滤掉了.

Swift 4.1:

let arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]
let arrayWithNoOptionals = arrayOfOptionals.compactMap { $0 }
Run Code Online (Sandbox Code Playgroud)

Swift 2.0:

let arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]
let arrayWithNoOptionals = arrayOfOptionals.flatMap { $0 }
Run Code Online (Sandbox Code Playgroud)

Swift 1.0:

let arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]
let arrayWithNoOptionals = arrayOfOptionals.filter { $0 != nil }.map { $0! }
Run Code Online (Sandbox Code Playgroud)

  • 在Swift 4.1中,`flatMap`(用于展开选项的目的)已被重命名为`compactMap`. (2认同)

vac*_*ama 9

由于它是一个可选项数组,因此有些条目可能是nil.相反的力展开!,使用零合并运算符,以轮流nils转换空字符串.

let arrayOfOptionals: [String?] = ["This", "array", nil, "has", "some", "nils", nil]

let array:[String] = arrayOfOptionals.map{ $0 ?? "" }
// array is now ["This", "array", "", "has", "some", "nils", ""]
Run Code Online (Sandbox Code Playgroud)