Array 的高階函式 filter, map and reduce.

這次要來跟大家介紹幾個在Swift 當中比較常用的陣列方法,不僅很神奇,而且可以大幅減少我們使用for迴圈的機會喔,對於整體的程式碼而言,也比較整潔,讓我們一起看看吧!

  1. Filter

假設今天有一個陣列如下

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

今天我們要把當中的所有偶數拿出來,組成另外一個陣列,大家有想過要怎麼做嗎?

透過for迴圈,走遍每一個元素,然後把 %2 == 0 的數字拿出來即可。

但是這樣的寫法有些不簡潔,所以我們可以透過 filter 只寫一行程式碼就達到我們的目標。

filter 後面接的是一個 closure, 在這個 closure 當中需要給一個整數,然後回傳一個布林值。

而我們在這邊傳入的整數是 $0, $0在這邊所代表的意義是 numbers 當中的每一個整數,然後我把這個整除以 2 取餘數,因為餘數僅可能為 0 或 1, 當餘數為 0 的時候代表這個判斷是為真,所以會把 $0 所代表的元素留下。 當餘數為 1 ,則表示該判斷式不成立,所以會把元素剔除,最後只會留下可以被 2整除的元素,也就是題目所求的偶數陣列啦!

2. Map

同上的 numbers 陣列,如果我們今天想要把陣列放大三倍變成下列這樣,你們會想怎麼做?

[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]

一樣可以透過for迴圈達到此目的,這邊我就不說明了,有問題再讓我知道喔

但是一樣不夠簡潔啊,array 當中有提供一個原生的方法 map ,為什麼不好好使用呢?

大家可以去看,我這邊使用了map這個方法,後面的括號中一樣是一個 closure, 如果有仔細去研究的話可以發現這個 closure 的型別是,給他一個整數,回傳一個 T

登愣~~~~ 什麼是 T !?

其實這邊用到的是一個泛型的寫法,這個 T 即表示我們所傳進去的資料型別,也就是說,丟什麼給他,map 這個方法就會回傳什麼東西,而在 closure 當中,一樣找到每一個傳進來的元素,然後把值 * 3,最後存在另外一個陣列當中即可。

3. Reduce

雖然函式名稱叫做reduce, 但是其用法主要被拿來做總和的運算。如果我們需要求得該陣列的總和,最基本的方法還是透過 for 迴圈,走遍每個元素後,再將其相加。

那該怎麼透過 reduce 來進行運算呢?

如果有點進去定義看,可以發現 reduce 後面接的第一個參數是初始值,表示你希望運算從何而起,我這邊設定為 0, 接著後面加上一個 closure, 在 closure 當中第一個變數代表每次運算的結果,第二個變數則是每次所傳進去的陣列,而我在 closure 當中所做的事情就是把當前的總和與傳進去的元素相加,每運算一次,會把結果存在 sum 當中,然後再進行下一次,直到陣列的元素都走過一遍的,就可以達到我們的目的囉!

當然也有終極簡寫版~~~

這邊就是最簡單的版本,我在 closure 當中只定義了傳進來的變數要做什麼事,其他的部分 Apple 就自己幫我處理好囉!

好的,以上的三個函式分享給大家,如果有問題的話,歡迎留言讓我知道囉!

--

--

Journey on programming
彼得潘的 Swift iOS / Flutter App 開發教室

Software Developer at 91APP. If you like my articles, please clap and follow me on Medium. Never stay still, never plateau!