Higher-Order Functions 高階函數(swift 4, iOS)

Jerry Wang
6 min readMar 3, 2017

--

最終專案:

高階函數(Higher-Order Functions)為一種函數,此函數可以接受其他函數為參數。(在swift中即closure的相關應用)

Higher-order functions is Functions that can accept other functions as parameters.

在swift中,有許多官方提供的好用高階函數,將可加速我們coding的速度,也使程式碼簡潔易讀。

以下分成6個部分,這6種高階函數皆作用於Array上,加速array相關的開發速度。

(1) map(2)filter(3)reduce(4)flatMap (5)compactMap(6)組合技

P.S. compactMap 為 Swift 4 新增之 API

(1)map

map函數作用於array內,將每個element一次一起進行轉換。

在其內將每個element取出,在return 後為回傳的array內的每個element。

如第13行,將numberArray內每個element取出,命名為number。在第14行內,將每個取出的element乘以2後並回傳。

在此回傳的屬性命名為twoTimesArray1,此為一個array,其內的element為numberArray內的每個element乘以2。

第18行,提供一個更簡便的寫法,此與closure中定義相同,在此不詳述。

第21行演示的為,原先的numberArray內的element為Int,但透過map函數,可將其轉為String。也就是說,map函數傳入的Array型別與回傳的Array型別不必相同。

(2)filter

filter用於對array內每個element進行條件判斷,在return 後放入條件判斷式。

回傳的篩選過後,符合所設條件的剩餘element形成的array

(3)reduce

reduce將array降一個維度,原先array內element的型別與回傳值的型別不一定要相同。

numberArray為維度為1的array,即array只有一層。在47行中,使用reduce,給定起始值,即(0),將起始值命名為initial,將numberArray內每個element命名為number。return 後做的是從initial開始,將每個number加起來,最後得到numberArray內的總和,回傳一個Int。

第55行可知,當起始值設定為100時,最後回傳的結果為155,不再為55。

第64行宣告一個二維array,也就是array內有array,此twoDimArray的element型別為array,因此reduce內的起始值需要array型別,在此放入

([ ]),回傳的型別為1維的array。

以上可知,透過reduce可將傳入的任何array降一個維度。

(4)flatMap

flatMap 會將 Array 降維度

作用在 2 維以上的 array,其內的Element 不可為 Optional Type。

回傳的 Element 是否為 Optional Type皆可。(可有 nil)

若要使用於 1 維array上,必定要使用compactMap,不可使用flatMap。

P.S. 何謂 Element?

[[1,2,3], [4,5,6]],以此 Array來說,Element 為 [Int],也就是[1,2,3] 和 [4,5,6]

與reduce不同的是,flatMap回傳必定為一個array,如第73行,作用於2維的array,則回傳 1 維的array。

如第77行,將原本的 2 維array,降為1 維 array,其內 Element 為 optional Type,可有 nil。

(5)compactMap

compactMap與flapMap不同,並不會對array降維度。

compactMap作用在 1 維以上的 Array,其內Element 是否為 Optional Type皆可。

將 nil 的 Element 拿掉並回傳 Array,故最後得到的array內的 Element 必定不為 Optional Type。(不可為 nil)

P.S. 最後得到的 Array內的 Element,若為 Array,則其內的 Element可為 optional Type

第84中,將 oneDimIntArrayWithNil 內的nil剔除,回傳一個 [Int] 陣列。

第97行中,傳入一個String陣列,在其中將陣列內每個element轉為Int,若無法轉換的即為nil,但會被剔除。最後得到的flatMappedPossibleNumbers即為[Int]

flatMap V.S. compactMap 做用於同一個 array

第105行,使用flatMap,單純降了1 個維度

第109行,使用compactMap,因為[nil]並非nil element,故不會被拿掉。

(6)組合技

高階函數可進行組合,如下所示,將所有功能一起連用。

結語:在array當中,對每個element作用,最基本的做法是透過for迴圈,將每個element取出,進行運算後得到新的Array。簡單的運算可以達成,但當目標複雜時,程式碼將變得雜亂,因此需要高階函數的進入來進行簡化。

--

--