學習swift高階函式的使用
前兩天在看佇列和棧的時候沒有看懂最後的reduce函式覺得很遺憾,所以就學習了一下swift提供的高階函式,Map,Flatmap,filter和reduce四個函式。這四個函式配合閉包使用會很方便。
swift自動為閉包提供引數名縮寫功能,可以直接通過1等來表示閉包中的第一個第二個引數,並且對應的引數型別會根據函式型別來進行判斷。
Map
map方法作用是把陣列[T]通過閉包函式把每一個數組中的元素變成U型別的值,最後組成陣列[U]。flatMap 更加強大,可以傳入N個處理方法,將處理後得到資料,組合到同一個陣列中
定義:func map(transform: (T) -> U) -> [U]
func map<T, U>(xs: [T], f: T -> U) -> [U] { var result: [U] = [] for x in xs { result.append(f(x)) } return result }
例項:
將陣列中每個數字都加10,獲得一個新的陣列:
let numberArray = [1,2,3,4,5] //採用閉包的方式 var result = numberArray.map({($0) + 10}) print(result) //flatMap,2個處理方法 var resultArray = numberArray.flatMap({["\($0)個","\($0 )只"]}) print(resultArray)
filte
filter就是篩選的功能,引數是一個用來判斷是否篩除的篩選閉包,根據閉包函式返回的Bool值來過濾值。為True則加入到結果陣列中。
定義:func filter(includeElement: (T) -> Bool) -> [T]
例子:找出陣列中大於2的數字
let numberArray = [1,2,3,4,5] var filteredArray = numberArray.filter({$0 > 2}) print(filteredArray)
reduce
reduce的作用給定一個型別為U的初始值,把陣列[T]中每一個元素傳入到combine的閉包函式裡面,通過計算得到最終型別為U的結果值。
定義:func reduce(initial: U, combine: (U, T) -> U) -> U
例子:求陣列中所有數字的平方和
let numberArray = [1,2,3,4,5] var sum = numberArray.reduce(0, {$0 + $1 * $1}) print(sum)
實現一下拼接地址:
let array = ["中國", "江蘇", "南京", "江寧區"] let address = array.joined(separator: "/") let add = array.reduce( "",{$0 + "/" + $1 } ) print(add)