Swift中的高階函數(shù)全家桶

??

在 Swift 中崔步,高階函數(shù)是非常常見且實(shí)用的概念菲茬,它可以讓我們以更簡(jiǎn)單铺呵、更表達(dá)式化的方式來處理集合類型裹驰。

常見的高階函數(shù)

1、map: 將集合中的每一個(gè)元素通過映射轉(zhuǎn)換為另外一個(gè)類型片挂。
struct Person{
    var name: String
    var age: Int
    var hobbies:[String]
}

     let array = [Person(name: "張三", age: 30, hobbies: ["吃"]),
                     Person(name: "李四", age: 10, hobbies: ["合"]),
                     Person(name: "王五", age: 40, hobbies: [])]
        
     // 普通遍歷
     var result = [String]()
     for p in array {
        result.append(p.name)
     }
     SPPrint.print(result) //["張三", "李四", "王五"]
        
     // 使用map函數(shù)可以將上述代碼簡(jiǎn)化:
     let result1 = array.map{ $0.name }
     SPPrint.print(result1) //["張三", "李四", "王五"]
2幻林、flatMap: 類似于 map,不過它對(duì)于返回類型為可選值的映射會(huì)將結(jié)果展開到最終結(jié)果中并且同時(shí)丟棄 nil 值音念。
     let allHobbies = array.flatMap { $0.hobbies }
     SPPrint.print(allHobbies) // ["吃", "合"] 
3沪饺、reduce: 將集合中的元素累積成一個(gè)值,也可以初始化一個(gè)初始值并和集合中的元素進(jìn)行累積操作闷愤。
     //函數(shù)用于對(duì)一個(gè)集合中的元素進(jìn)行累加或者其他操作整葡,返回一個(gè)計(jì)算結(jié)果
     let ages = array.reduce(0) { $0 + $1.age}
     SPPrint.print(ages) // 80
        
     let numbers = [1, 2, 3, 4]
     let sum = numbers.reduce(0, +)
     SPPrint.print(sum) // 10
4、sorted: 對(duì)集合中的元素進(jìn)行排序讥脐,可以指定排序規(guī)則遭居。
     let numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
     let sortedNumbers = numbers.sorted()
     SPPrint.print(sortedNumbers) // [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

     let descendingNumbers = numbers.sorted(by: >)
     SPPrint.print(descendingNumbers) // [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
        
     var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
     students.sort(by: >)
     SPPrint.print(students) //["Peter", "Kweku", "Kofi", "Akosua", "Abena"]
5、forEach: 對(duì)集合中的每一個(gè)元素執(zhí)行操作旬渠,但不返回任何值俱萍。
     let numbers = [1, 2, 3, 4]
     numbers.forEach { SPPrint.print($0) }
     // 1
     // 2
     // 3
     // 4
6、compactMap: 對(duì)集合中的元素進(jìn)行映射操作告丢,并把返回值不為 nil 的元素重新組成一個(gè)新的集合枪蘑。
     let strs = ["1", "2", "3", "hello", "4"]
     let nums = strs.compactMap { Int($0) }
     SPPrint.print(nums) // [1, 2, 3, 4]
     let evenNumbers = strs.compactMap { Int($0) }.filter { $0 % 2 == 0 }
     SPPrint.print(evenNumbers) //[2, 4]
7、contains: 判斷集合中是否包含某個(gè)元素岖免。
     let numbers = [1, 2, 3, 4]
     let containsThree = numbers.contains(3)
     print(containsThree) // true
8岳颇、first(where:): 查找滿足特定條件的第一個(gè)元素,并返回該元素觅捆。
//開發(fā)中常見場(chǎng)景:查找數(shù)組中滿足某些條件的第一個(gè)元素
    if let person = array.first(where: { $0.name  == "王五"}) {
            SPPrint.print("\(person.name)") //王五
        }else {
            SPPrint.print("not found")
        }
9赦役、filter: 該方法可以根據(jù)一個(gè)閉包中的條件篩選出需要保留的元素,并返回一個(gè)符合條件的新數(shù)組栅炒〉嗨ぃ可以通過使用這個(gè)新數(shù)組來替換原始數(shù)組。
//使用了filter()方法赢赊,并將一個(gè)閉包作為參數(shù)傳遞給它乙漓。
//在這個(gè)閉包中,檢查每個(gè)元素的名字是否不等于“Bob”释移,如果匹配成功叭披,則返回true,表示這個(gè)元素應(yīng)該被保留玩讳。
//最后涩蜘,我們用符合條件的新數(shù)組替換原始數(shù)組嚼贡。
     array = array.filter { $0.name != "王五" }
     SPPrint.print(array)
     //[SwiftProject.Person(name: "張三", age: 30, hobbies: ["吃"]), SwiftProject.Person(name: "李四", age: 10, hobbies: ["合"])]       
10、removeAll: 該方法可以根據(jù)一個(gè)閉包中的條件篩選出需要被移除的元素
//使用了removeAll()方法同诫,并將一個(gè)符合特定條件的閉包作為參數(shù)傳遞給它粤策。
//在這個(gè)閉包中,我們檢查每個(gè)元素的名字是否為“Bob”误窖,如果匹配成功叮盘,則返回true,表示這個(gè)元素應(yīng)該被移除霹俺。
     array.removeAll { $0.name == "王五" }
     SPPrint.print(array) 
     // [SwiftProject.Person(name: "張三", age: 30, hobbies: ["吃"]), SwiftProject.Person(name: "李四", age: 10, hobbies: ["合"])]
11柔吼、allSatisfy: 判斷集合中的所有元素是否都滿足某個(gè)條件。
     let numberss = [1, 2, 3, 4]
     let allGreaterThanZero = numberss.allSatisfy { $0 > 0 }
     let allGreaterThanOne = numberss.allSatisfy { $0 > 1 }
     SPPrint.print(allGreaterThanZero) // true
     SPPrint.print(allGreaterThanOne) // false 
12丙唧、joined: 將多個(gè)集合拼接成一個(gè)大集合愈魏,如果是二維及以上的集合會(huì)自動(dòng)進(jìn)行降維處理。
     let numberss = [1, 2, 3, 4]
     let allGreaterThanZero = numberss.allSatisfy { $0 > 0 }
     let allGreaterThanOne = numberss.allSatisfy { $0 > 1 }
     SPPrint.print(allGreaterThanZero) // true
     SPPrint.print(allGreaterThanOne) // false 
13艇棕、firstIndex(where:): 用于查找集合中第一個(gè)滿足某個(gè)條件的元素的索引蝌戒。
     let numbersssss = [1, 2, 3, 4]
     let firstEvenIndex = numbersssss.firstIn
dex(where: { $0 % 2 == 0 })
     SPPrint.print(firstEvenIndex ?? 0) // 1

     let index = array.firstIndex(where: { $0.name  == "王五"})
     SPPrint.print(index) // 2
14、zip: 將兩個(gè)集合中的元素一一對(duì)應(yīng)起來沼琉,組成一個(gè)新的元組數(shù)組北苟。
     let numbs = [1, 2, 3]
     let letters = ["A", "B", "C"]
     let pairs = zip(numbs, letters)
     SPPrint.print(Array(pairs)) //[(1, "A"), (2, "B"), (3, "C")]
15、partition(by:): 將集合劃分成兩個(gè)部分打瘪,使得滿足某個(gè)條件的元素放在前面友鼻,不滿足條件的放在后面,并返回分界點(diǎn)索引闺骚。
// 將數(shù)組分成兩部分彩扔,滿足條件的元素在左側(cè),不滿足條件的元素在右側(cè)僻爽。
// 然后虫碉,只需要遍歷左側(cè)部分的元素,就可以獲得所有滿足條件的元素胸梆。
     var passengers = ["Alice", "Bob", "Charlie", "David","b"]
     SPPrint.print(passengers.partition { $0.count <= 4 }) 
     // ["Alice", "David", "Charlie", "Bob", "b"]
16敦捧、stride: 用于創(chuàng)建一個(gè)由指定范圍內(nèi)元素組成的序列
        //使用 stride 函數(shù)創(chuàng)建了一個(gè)由 0 到 10 的整數(shù)(不包括 10)組成的序列,步長(zhǎng)為 2碰镜。
     for i in stride(from: 0, to: 10, by: 2) {
           SPPrint.print(i) //打印的結(jié)果是 0兢卵、2、4绪颖、6秽荤、8
     }
        //使用 stride 函數(shù)創(chuàng)建了一個(gè)從 10 到 1 的整數(shù)序列,步長(zhǎng)為 -1。因此
     for i in stride(from: 10, to: 0, by: -1) {
           SPPrint.print(i) //打印的結(jié)果是 10窃款、9课兄、8、...雁乡、2第喳、1
     }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市踱稍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悠抹,老刑警劉巖珠月,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異楔敌,居然都是意外死亡啤挎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門卵凑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庆聘,“玉大人,你說我怎么就攤上這事勺卢』锱校” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵黑忱,是天一觀的道長(zhǎng)宴抚。 經(jīng)常有香客問我,道長(zhǎng)甫煞,這世上最難降的妖魔是什么菇曲? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮抚吠,結(jié)果婚禮上常潮,老公的妹妹穿的比我還像新娘。我一直安慰自己楷力,他們只是感情好喊式,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弥雹,像睡著了一般垃帅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剪勿,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天贸诚,我揣著相機(jī)與錄音,去河邊找鬼。 笑死酱固,一個(gè)胖子當(dāng)著我的面吹牛械念,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播运悲,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼龄减,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了班眯?” 一聲冷哼從身側(cè)響起希停,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎署隘,沒想到半個(gè)月后宠能,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磁餐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年违崇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诊霹。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羞延,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脾还,到底是詐尸還是另有隱情伴箩,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布荠呐,位于F島的核電站赛蔫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏泥张。R本人自食惡果不足惜呵恢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望媚创。 院中可真熱鬧渗钉,春花似錦、人聲如沸钞钙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芒炼。三九已至瘫怜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間本刽,已是汗流浹背鲸湃。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工赠涮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暗挑。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓笋除,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親炸裆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垃它,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容