Swift Higher-Order-Functions(高階函數)

法蘭克的 iOS 世界
5 min readMar 26, 2017

--

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
移除 nil 值降維度

相對於 map(_:),flatMap(_:) 會 unwrap 和去除 nil 值。

flatMap(_:) 會 unwrap 和去除 nil 值

雖 flatMap(_:) 可去移 nil 值,不過編譯器會產生告警以用來表示已被 Apple 所廢棄,建議使用 compactMap(_:)

編譯器會產生告警以用來表示已被 Apple 所廢棄,建議使用 compactMap(_:)

contains(where:)

回傳一 Boolean 值來表示此 Sequence 是否包含設定的條件。

func contains(where predicate: (Element) throws -> Bool) rethrows -> Bool

驗證陣列裡是否包含小於 5 的數字

延伸應用

移除陣列裡 nil 的元素後,並加總所有偶數的合

將陣列裡的自定義物件,轉成 Dictionary 並存放在陣列裡

此議題的 Solutions 很多種,最適合的是用 reduce(_:_:) 來解,因為從可讀性的角度來看,很直覺的看出將自定義物件的值取出並放進單一的值(這裡的案例是 Array)裡。

如果您喜歡我的文章,請多按幾下「拍手」給我鼓勵,或是按「follow」讓我持續提供好文章給您。

--

--

No responses yet