Swift 5.0-flatMap與compactMap
Swift 5.0 中flatMap可以將陣列扁平化,實現陣列降維,例如:
1.flatMap應用於序列並返回一個序列:
let results = [[2,5,7], [4,8], [1,10,3]] let allResults = results.flatMap { $0 } print("\(allResults)") [2, 5, 7, 4, 8, 1, 10, 3]
可以將陣列進行二次過濾:
let filters = results.flatMap { $0.filter { $0 > 5} } [7, 8, 10]
2.flatMap應用於可選型別:
如果原始的值是nil然後flatMap返回nil:
let input: Int? = Int("10") let opres: Int? = input.flatMap { $0 > 5 ? $0 : nil } print("\(String(describing: opres))")
Optional(10)
3.序列可選型別,Swift 4.1之前可以使用flatMap,現在需要compactMap:
let names: [String?] = ["Fly", nil, "Elephant", nil, "FlyElephant"] let valid = names.flatMap { $0 } print("\(valid)")
警告提示:
'flatMap' is deprecated: Please use compactMap(_:) for the case where closure returns an optional value
修改之後的程式碼:
let names: [String?] = ["Fly", nil, "Elephant", nil, "FlyElephant"] let valid = names.compactMap { $0 } print("\(valid)")
陣列中通過型別轉換返回nil,也會出現警告:
let words = ["53", "FlyElephant", "hello","0"] let values = words.flatMap { Int($0) }
compactMap替換flatMap可以移除:warning::
let words = ["53", "FlyElephant", "hello","0"] let values = words.compactMap { Int($0) } print("\(values)")
[53, 0]
一般情況下map與flatMap的功能是相似的,都可以執行map工作。
compactMap的改變是在於將flatMap處理non-optional序列型別,compact處理optional型別。