2014-08-31 47 views
28

的數組假設我們有定義自選的數組:斯威夫特:快捷方式展開自選

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

我可以強制解開它在很短的方式:var arrayForCrash = arrayOfOptionals.map { $0! }

但是,這將使應用程序崩潰,有沒有其他簡短的方法(沒有明確展開)我如何解開一個可選的數組?

+0

@Antonio [「如果您有一個問題,您已經知道答案,並且您想公開記錄這些知識,以便其他人(包括您自己)能夠在以後找到答案,那麼完全可以問問並回答您的問題自己的問題在堆棧交換網站上。「](http://stackoverflow.com/help/self-answer) – 2014-08-31 08:43:41

+0

刪除我的評論上面 - 他們現在是不相關的。 @Hurden,我再次道歉 – Antonio 2014-08-31 08:46:18

+0

@Antonio沒問題,隊友 – ambientlight 2014-08-31 08:50:04

回答

76

該解決方案將爲您提供一個新數組,其中所有值都展開並且所有零都被濾除。

利用flatMap新的解決方案(需要雨燕2.0):

let arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"] 
let arrayWithNoOptionals = arrayOfOptionals.flatMap { $0 } 

老辦法:

let arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"] 
let arrayWithNoOptionals = arrayOfOptionals.filter { $0 != nil }.map { $0! } 
+0

這是迄今爲止最好的解決方案。它還會返回一個'[String]'數組' – Yariv 2014-12-16 18:45:35

+0

這隻適用於Swift 2,它目前仍處於測試階段。 – 2015-08-06 17:45:41

0

如何:

import Foundation 

var test: [String!] = ["this","is","a",nil,"test"] 
for string in test { 
    if string != nil { 
     print(string) 
    } 
} 

輸出爲thisisatest


在你的情況下使用[String!],如果我的理解正確。

9

由於它是一個可選項的數組,因此可能有些條目是nil。而不是強制展開!,使用零合併運算符nil s變成空字符串。

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

let array:[String] = arrayOfOptionals.map{ $0 ?? "" } 
// array is now ["This", "array", "", "has", "some", "nils", ""] 
+0

無關問題。你應該知道你的元素類型是一個空的選擇。 – gaussblurinc 2016-03-25 13:27:11

1

我把@ Cenny的答案,並決定把操作出來的:

prefix operator <!> {} 

prefix func <!> <T>(array: [T?]) -> [T] { 
    return array.filter{ $0 != nil }.map{ $0! } 
} 

我用它來解析JSON對象數組並過濾這些數據t帽子失敗:

static func parse(j: JSONArray) -> [Agency]? { 
    return <!>j.map { self.parse($0) } 
} 

更新斯威夫特2+:
使用flatMap運營商,它只會返回非空對象

3

雖然可以使用flatMap { $0 }刪除尼爾斯,flatMap實際上是一個更強大的功能,並有一個重載的版本,它做了完全不同的事情(例如,壓平[[Int]][Int])。如果你不小心,你可能會意外地調用錯誤的函數。

我建議在SequenceType上使用擴展來刪除nils。如果你使用removeNils(),你就可以基本上做到以下幾點:

[1, nil, 2].removeNils() == [1, 2] 

它通過使Optional符合它允許延長包含OptionalSequenceType秒的OptionalType協議。請參閱original answer I posted