Swift Higher-Order-Functions(高階函數)
Swift 提供了幾個高階函數來處理並簡化常用的開發邏輯,以讓開發者能更專注於 UI/UX 的設計或是商業邏輯上,善加利用高階函數可讓語法看起來更精簡。其應用搭配著閉包 (Closure) ,所以在使用高階函數之前,必須也先對閉包 (Closure) 有一定的了解,使用過程中才不會有疑惑的地方。
sort()
針對合乎 Comparable protocol 的陣列提供排序能力。
extension Array where Element : Comparable {
public func sorted() -> [Element]
public mutating func sort()
}
sorted() => 回傳排序陣列結果,不影響原陣列內容。
sort() => 回傳排序陣列結果,並將結果存回原陣列。
另外也可使用「<」、「>」符號來指定排序的方式,「<」=>由小到大,「>」由大到小,以下示範使用「<」來排序英文字母:
以上是合乎 Comparable 協定的陣列可使用的排序方式。
以下為 Array 自身的排序方法。
sort() => areIncreasingOrder 為匿名函數或閉包,用來設定排序的方式。
sorted() => areIncreasingOrder 為匿名函數或閉包,用來設定排序的方式,回傳結果為一陣列。
以下為使用 sort() 來達成排序的功能範例:
第 4 行 => 可透過 ComparisonResult Enum 來設定排序的方式。
ComparisonResult.orderedAscending => 由小排到大。
ComparisonResult.orderedDescending => 由大排到小。
filter(_:)
用來 濾出
自行設定的條件,例年齡小於 18 歲、體重大於 80 的。
func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]
map(_:)
針對陣列裡的每個元素作額外的處理後並回傳結果陣列。
func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
reduce(_:_:)
等同於使用遞迴的方式來求出陣列的總合值,其應用不僅限求總合,在文末延伸應用有其它案例可參考。
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
initialResult => 表示 nextPartialResult 函式的初始值。
nextPartialResult => 為匿名函數或閉包,用來將上次遞迴的結果 Result 與下個元素的結合後,產生新的結果 Result 作為下次遞迴函式的輸入值。
flatMap(_:)
相對於 map(_:),其還增加了 移除 nil 值
和降維度
的功能。其型別限制必須遵從 Sequence protocol,Sequence 代表的是一個有序的資料結構,例常見的 Array 就有符合 Sequence,可用for..in 的方法來取用內容。
func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
相對於 map(_:),flatMap(_:) 會 unwrap 和去除 nil 值。
雖 flatMap(_:) 可去移 nil 值,不過編譯器會產生告警以用來表示已被 Apple 所廢棄,建議使用 compactMap(_:)
延伸應用
移除陣列裡 nil 的元素後,並加總所有偶數的合
將陣列裡的自定義物件,轉成 Dictionary 並存放在陣列裡
此議題的 Solutions 很多種,最適合的是用 reduce(_:_:) 來解,因為從可讀性的角度來看,很直覺的看出將自定義物件的值取出並放進單一的值(這裡的案例是 Array)裡。
如果您喜歡我的文章,請多按幾下「拍手」給我鼓勵,或是按「follow」讓我持續提供好文章給您。