Swift 高階函數 Map,Filter,Reduce

一、關于閉包

Swift函數是一等公民,Swift一大特性就是使用簡潔的語言去替代復雜的函數操作。
所謂閉包就是自包含的函數代碼塊,可以在代碼中被傳遞和使用。
Swift中的閉包與C、OC中的blcok和其他語言中的匿名函數相似。

"閉包可以捕獲和存儲其所在上下文中任意常量和變量的引用。被稱為包裹常量和變量。 Swift 會為你管理在捕獲過程中涉及到的所有內存操作。”
--------------------------------------摘錄來自: “The Swift Programming Language 中文版”。

閉包采取如下三種形式之一:

  • 全局函數是一個有名字但不會捕獲任何值的閉包
  • 嵌套函數是一個有名字并可以捕獲其封閉函數域內值的閉包
  • 閉包表達式是一個利用輕量級語法所寫的可以捕獲其上下文中變量或常量值的匿名閉包

Swift 的閉包表達式擁有簡潔的風格,并鼓勵在常見場景中進行語法優化,主要優化如下:

  • 利用上下文推斷參數和返回值類型
  • 隱式返回單表達式閉包,即單表達式閉包可以省略 return 關鍵字
  • 參數名稱縮寫
  • 尾隨閉包語法”

從繁到簡看Swif中的閉包形式

  //求兩個整數之和
  func addFun(a:Int , b:Int) -> Int{
          return a + b  
  }
  //求兩個整數之積
 func  mulFun(a:Int , b:Int) -> Int{
           return a * b 
}
//對兩個數進行運算 為了動態計算我們傳入規則
func caculateFun(a:Int , b:Int , someFun:(Int,Int) ->Int) -> Int{
    return someFun(a,b)
}
//之前我們通常會這樣做:
caculateFun(a: 10, b: 2, someFun: addFun)  // 12
caculateFun(a: 10, b: 2, someFun: mulFun)  // 20

//然后我們可以優化成這樣:
caculateFun(a: 20, b: 2, someFun: { (x, y) -> Int in
    return x * y
})

//在Swift中我們可以繼續我們成更改形式 
//我們稱之為 尾隨閉包
caculateFun(a: 20, b: 2) { (x, y) -> Int in
    return x * y
}//40
//又因為Swift中存在類型推斷 能從caculateFun的聲明中推斷出傳入作為參數的函數期望接收兩個Int并返回一個Int值 所以我們繼續簡化
caculateFun(a: 10, b: 2) { (x, y) in
    return x * y
} //20
//最后我們還可以忽略指定參數名,使用默認參數名$0(如果函數接收多個參數,使用$K作為第K-1個參數,如$0,$1,$2......)
caculateFun(a: 10, b: 40){
       $0 * $1
}
//所以我們的例子在Swift中的閉包最簡形式就變成 
caculateFun(a: 10, b: 40){ $0 * $1}

二、高階函數

接下來我們再看下高階函數Map,Filter,Reduce的使用,可以極大的簡化我們的代碼
Map
map用于將每個數組元素通過某個方法進行轉換。

//有一個數組 我們想對每一個數組中的元素都+1 
  let array = [1,2,3,4,5,6]
//之前我們一般創建一個空數組 遍歷源數組進行操作
  var resultArray = [Int]()
  for x in array {
      resultArray.append(x + 1)
  }
//現在我們一行搞定
resultArray = array.map{$0 + 1}

Filter
filter用于選擇數組元素中滿足某種條件的元素。

//我們要篩選大于零的
let numbers = [2, -5, 9, 7, -2, 5, 3, 1, 0, -3, 8]
//傳統
var result = [Int]()
for x in numbers {
    result.append(x + 1)
}
//使用Filter
result = numbers.filter{$0 > 0}

Reduce
reduce方法把數組元素組合計算為一個值。

//我們要求和
let numbers = [2, -5, 9, 7, -2, 5, 3, 1, 0, -3, 8]
//傳統
var result = 0
for x in numbers {
    result += x
}
//使用reduce
result = numbers.reduce(0,{$0+$1})

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

推薦閱讀更多精彩內容