的數組假設我們有定義自選的數組:斯威夫特:快捷方式展開自選
var arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]
我可以強制解開它在很短的方式:var arrayForCrash = arrayOfOptionals.map { $0! }
但是,這將使應用程序崩潰,有沒有其他簡短的方法(沒有明確展開)我如何解開一個可選的數組?
的數組假設我們有定義自選的數組:斯威夫特:快捷方式展開自選
var arrayOfOptionals: [String?] = ["Seems", "like", "an", nil, "of", "optionals"]
我可以強制解開它在很短的方式:var arrayForCrash = arrayOfOptionals.map { $0! }
但是,這將使應用程序崩潰,有沒有其他簡短的方法(沒有明確展開)我如何解開一個可選的數組?
該解決方案將爲您提供一個新數組,其中所有值都展開並且所有零都被濾除。
利用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! }
這是迄今爲止最好的解決方案。它還會返回一個'[String]'數組' – Yariv 2014-12-16 18:45:35
這隻適用於Swift 2,它目前仍處於測試階段。 – 2015-08-06 17:45:41
如何:
import Foundation
var test: [String!] = ["this","is","a",nil,"test"]
for string in test {
if string != nil {
print(string)
}
}
輸出爲thisisatest
。
在你的情況下使用[String!]
,如果我的理解正確。
由於它是一個可選項的數組,因此可能有些條目是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", ""]
無關問題。你應該知道你的元素類型是一個空的選擇。 – gaussblurinc 2016-03-25 13:27:11
我把@ 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
運營商,它只會返回非空對象
雖然可以使用flatMap { $0 }
刪除尼爾斯,flatMap實際上是一個更強大的功能,並有一個重載的版本,它做了完全不同的事情(例如,壓平[[Int]]
至[Int]
)。如果你不小心,你可能會意外地調用錯誤的函數。
我建議在SequenceType上使用擴展來刪除nils。如果你使用removeNils()
,你就可以基本上做到以下幾點:
[1, nil, 2].removeNils() == [1, 2]
它通過使Optional
符合它允許延長包含Optional
值SequenceType
秒的OptionalType
協議。請參閱original answer I posted。
@Antonio [「如果您有一個問題,您已經知道答案,並且您想公開記錄這些知識,以便其他人(包括您自己)能夠在以後找到答案,那麼完全可以問問並回答您的問題自己的問題在堆棧交換網站上。「](http://stackoverflow.com/help/self-answer) – 2014-08-31 08:43:41
刪除我的評論上面 - 他們現在是不相關的。 @Hurden,我再次道歉 – Antonio 2014-08-31 08:46:18
@Antonio沒問題,隊友 – ambientlight 2014-08-31 08:50:04