Higher-Order Functions 高階函數(swift 4, iOS)
最終專案:
高階函數(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。簡單的運算可以達成,但當目標複雜時,程式碼將變得雜亂,因此需要高階函數的進入來進行簡化。