Swift 四種高階函數簡介

高階函數 - Higher order functions

Swift作為一門多范式編程語言,尤其是對函數式編程的支持,成就了Swift對高階函數的無障礙運用。

高階函數僅僅只是一個函數,其可以接收函數作為參數,或者返回一個函數來操作其他函數。Swift的集合類型中就有這些高階函數:Map, FlatMap, Filter, 和Reduce。

Map

對集合進行循環,并對集合中的每個元素采取相同的操作

為了更簡單的介紹這個函數,假設我們有一個需求:將[1, 2, 3]轉換為["1", "2", "3"],一般情況下我們會這么做:

var numbers = [1, 2, 3]

var strings: [String] = []

for number in numbers {
    strings.append("\(number)")
}
print(strings)

如果我們使用Map函數:

var numbers = [1, 2, 3]

var stringsUseMap1 = numbers.map({(value: Int) -> String in
    return String(value)
})
//stringsUseMap1 = ["1", "2", "3"]

var stringsUseMap2 = numbers.map{(value: Int) in
    return String(value)
}
//stringsUseMap2 = ["1", "2", "3"]

var stringsUseMap3 = numbers.map{ value in String(value) }
//stringsUseMap3 = ["1", "2", "3"]

var stringsUseMap4 = numbers.map{ String($0) }
//stringsUseMap4 = ["1", "2", "3"]

以上四種Map函數的調用都是正確的,唯一的區別就是你喜歡使用長的還是喜歡使用短的。

在Swift中,如果閉包是函數的唯一參數或是其最后一個參數時,()可以被省略。

Swift 自動為內聯函數提供了參數名稱縮寫功能,您可以直接通過$0,$1,$2來順序調用閉包的參數。
如果您在閉包表達式中使用參數名稱縮寫,您可以在閉包參數列表中省略對其的定義,并且對應參數名稱縮寫的類型會通過函數類型進行推導。 in關鍵字也同樣可以被省略。上面例子中$0為數組numbers內部每一個元素的代表。

Filter

循環遍歷集合并返回包含滿足條件的元素的數組

現在我們需要對數組中數字進行奇數和偶數的處理:


var numbersFilter = [1, 2, 3, 4, 5, 6, 7, 8]

//從數組中刪除所有奇數(即保留所有滿足條件的元素)
var evenNumbersFilter = numbersFilter.filter { $0 % 2 == 0 }
print(evenNumbersFilter)
//"[2, 4, 6, 8]\n"

//刪除所有偶數
var oddNumbersFilter = numbersFilter.filter { $0 % 2 == 1 }
print(oddNumbersFilter)
//"[1, 3, 5, 7]\n"

使用Filter函數簡單到無法形容!!!

Reduce

將集合中的所有項組合起來,以創建一個單一的值。

假設我們現在需要計算數組中數字的和:

var numbersReduce = [1, 2, 3, 4, 5]

var sum = numbersReduce.reduce(0) { $0 + $1 } // 15

上例等同于0+1+2+3+4+5, 0是一個初始值,$0是前兩個值的和(即0,1,...),$1(1,2,3,4,5)是數組的下一個值。

或者簡化為:

var numbersReduce = [1, 2, 3, 4, 5]
var sumReduce = numbersReduce.reduce(0, +) // 15

Reduce接受兩個參數,一個初始值,一個用于合并數組元素的閉包。為Reduce提供的閉包中有兩個參數,第一個是部分結果,第二個是來自數組的一個元素。閉包會針對每個元素進行逐次調用。

或者將字符串數組中的字符串進行合并:

var combineStrings = ["oh","captain",",","my","captain"].reduce(""){$0 + $1};
//combineStrings = ohcaptain,mycaptain

FlatMap

當在序列上實現時:對集合的集合進行平化

假設我們現在有一個數組,其元素是兩個數組,每個數組內的元素是一些數字,我們需要將這些數字放到一個數組中:

var arrayInArray = [[1,2,3],[6,7,8]]

var flattenedArray = arrayInArray.flatMap{$0}
//flattenedArray = [1, 2, 3, 6, 7, 8]

簡單到窒息??!

鏈式調用

let animals = ["cat", "dog", "turtle", "swift", "elephant"]
let listAnimals = animals
    .filter {$0 != "dog"}
    .map {"\($0) "}
    .reduce("") { $0 + $1 }
print(listAnimals)

上例中:首先創建一個數組,然后對數組animals調用高階函數filter,filter尾隨閉包內部的條件,幫助我們去除了animals中的字符串dog并生成了一個數組["cat", "turtle", "swift", "elephant"],然后對這個新生成的數組調用高階函數map,生成一個每個元素都包含一個空格的數組["cat ", "turtle ", "swift ", "elephant "],最后再對這個新數組執行reduce函數,初始值接受一個空字符串,尾隨閉包執行合并數組中元素的操作,最終,listAnimals的結果是“cat turtle swift elephant ”

學習這些高階函數有什么意義?

  • 閱讀和理解復雜的函數式編程
  • 編寫更優美、更易于維護的代碼,具有更好的可讀性
  • 提高我們的Swift語言能力
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,957評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,248評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,356評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,081評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,485評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,720評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,263評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,025評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,204評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,461評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,874評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,105評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,945評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,205評論 2 375

推薦閱讀更多精彩內容