Array 的高階函式 filter, map and reduce.
這次要來跟大家介紹幾個在Swift 當中比較常用的陣列方法,不僅很神奇,而且可以大幅減少我們使用for迴圈的機會喔,對於整體的程式碼而言,也比較整潔,讓我們一起看看吧!
- 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 就自己幫我處理好囉!
好的,以上的三個函式分享給大家,如果有問題的話,歡迎留言讓我知道囉!