最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入淺出的聊聊Swift高階函數(shù)

 更新時(shí)間:2021年09月02日 15:41:43   作者:洋仔  
函數(shù)式編程就是高階函數(shù)編程的應(yīng)用,所以要熟練掌握基礎(chǔ)的高階函數(shù)是必須的filter、map、reduce、flatmap就是必備的高階函數(shù),這篇文章主要給大家介紹了關(guān)于Swift高階函數(shù)的相關(guān)資料,需要的朋友可以參考下

初探高階函數(shù)

在 Swift 中,高階函數(shù)一共有下面幾個(gè):

  • map:對(duì)給定數(shù)組每個(gè)元素,執(zhí)行閉包中的映射,將映射結(jié)果放置在數(shù)組中返回。
  • flatMap:對(duì)給定數(shù)組的每個(gè)元素,執(zhí)行閉包中的映射,對(duì)映射結(jié)果進(jìn)行合并操作,然后將合并操作后的結(jié)果放置在數(shù)組中返回。
  • compactMap:對(duì)給定數(shù)組的每個(gè)元素,執(zhí)行閉包中的映射,將非空的映射結(jié)果放置在數(shù)組中返回。
  • compactMap對(duì)給定數(shù)組的每個(gè)元素,執(zhí)行閉包中的映射,將非空的映射結(jié)果-鍵值對(duì)放置在字典中返回。
  • filter:對(duì)給定數(shù)組的每個(gè)元素,執(zhí)行閉包中的操作,將符合條件的元素放在數(shù)組中返回。
  • reduce:對(duì)給定數(shù)組的每個(gè)元素,執(zhí)行閉包中的操作對(duì)元素進(jìn)行合并,并將合并結(jié)果返回。

通過(guò)上面的闡述,我們大概了解到了這幾個(gè)函數(shù)是做什么用的,下面我們?cè)谕ㄟ^(guò)幾個(gè)例子來(lái)具體看一下代碼上如何使用。

map

對(duì)于 map 函數(shù),使用場(chǎng)景就是將數(shù)組的類(lèi)型映射為別的類(lèi)型。比如,我們有一個(gè)模型數(shù)組,模型的 id 字段我們從服務(wù)器拿的是 String 類(lèi)型,在某種場(chǎng)景下我們需要轉(zhuǎn)為 Int 類(lèi)型,這時(shí)候我們就可以通過(guò) map 函數(shù)來(lái)實(shí)現(xiàn)該需求。

struct Student {
    let id: String
    let name: String
    let age: Int
}
 
let stu1 = Student(id: "1001", name: "stu1", age: 12)
let stu2 = Student(id: "1002", name: "stu2", age: 14)
let stu3 = Student(id: "1003", name: "stu3", age: 16)
let stu4 = Student(id: "1004", name: "stu4", age: 20)
let stus = [stu1, stu2, stu3, stu4]
 
let intIds = stus.map { (stu) in
    Int(stu.id)
}
 
print(intIds) //[Optional(1001), Optional(1002), Optional(1003), Optional(1004)]

通過(guò)上述代碼,我們將 id 字段從 String 映射為了 Int? 類(lèi)型,這并不是我們想要的 Int 類(lèi)型。如果我們需要訪問(wèn)元素的話還得需要解包,那么我們?nèi)绾渭饶軐⒃赜成溆帜茏詣?dòng)篩選 nil 的值呢?這時(shí),就輪到 compactmap 出馬了。

compactMap

我們將上面的代碼替換為:

 let intIds = stus.compactMap { (stu) in
     Int(stu.id)
   }

這時(shí),我們?cè)俅蛴?intIds 就會(huì)發(fā)現(xiàn)它已經(jīng)為 Int 類(lèi)型了。

compactMapValues

對(duì)于 Set 和 Array ,你可以使用 compactMap 來(lái)獲得非空的集合,但是對(duì)于 Dictionary 來(lái)說(shuō),這個(gè)函數(shù)是不起作用的。

let dict = ["key1": 10, "key2": nil]
let result = dict.compactMap { $0 }
print(result) //[(key: "key1", value: Optional(10)), (key: "key2", value: nil)]

這時(shí)候,我們需要使用 compactMapValues 函數(shù)來(lái)獲得非空的字典。

  print(result) //["key1": 10]
 let result = dict.compactMapValues { $0 }
 print(result) //["key1": 10]

flatMap

對(duì)于 flatMap,主要的應(yīng)用場(chǎng)景就是你想獲得一個(gè)單層集合的數(shù)組。通過(guò)下面的代碼來(lái)看一下 map 和 flapMap 的區(qū)別。

  let scoresByName = ["Henk": [0, 5, 8], "John": [2, 5, 8]]

  let mapped = scoresByName.map { $0.value }
  // [[2, 5, 8], [0, 5, 8]]
  print(mapped)

 let flatMapped = scoresByName.flatMap { $0.value }
  // [2, 5, 8, 0, 5, 8]

map 會(huì)直接將元素放在數(shù)組中,而 flatMap 會(huì)將元素平鋪在一個(gè)數(shù)組中。實(shí)際上,s.flatMap(transform) 等同于s.map(transform).joined()。

filter

這個(gè)函數(shù)就如同單詞的意思:查找。將符合條件的元素查找出來(lái)放置在數(shù)組中返回。比如我們想查找年齡大于18歲的所有學(xué)生。

let adults = stus.filter { (stu) -> Bool in
        stu.age >= 18
       }
  print(adults) // 數(shù)組中只包含stu4 學(xué)生

reduce

對(duì)于 reduce,我們的使用場(chǎng)景就是對(duì)數(shù)組中的元素進(jìn)行組合運(yùn)算,比如我們想計(jì)算所有學(xué)生的年齡加載一起是多少。

let totalAges = stus.reduce(0) { (result, stu) in
        return result + stu.age
        }
    print(totalAges) // 62

該函數(shù)的第一個(gè)參數(shù)為初始值,后面元組中的第一個(gè)參數(shù)為每次計(jì)算的結(jié)果,第二個(gè)參數(shù)為每次遍歷的元素。最后將計(jì)算的結(jié)果返回。

組合使用

對(duì)于使用高階函數(shù)最大的好處就是可以進(jìn)行函數(shù)式編程了。下面我們通過(guò)幾個(gè)小栗子來(lái)對(duì)這幾個(gè)高階函數(shù)進(jìn)行組合使用。

將 String 類(lèi)型映射為 Int 類(lèi)型,并查找id大于1002的所有學(xué)生

let adults = stus.compactMap { (stu) in
        Int(stu.id)
        }.filter { (id) -> Bool in
           id > 1002
        }
    print(adults) //[1003, 1004]

計(jì)算年齡大于12的所有學(xué)生年齡總和

let totalAge = stus.filter { (stu) -> Bool in
            stu.age > 12
    }.reduce(0) { (result, stu) in
   return result + stu.age
   }
   print(totalAge) // 50

總結(jié)

到此這篇關(guān)于Swift高階函數(shù)的文章就介紹到這了,更多相關(guān)Swift高階函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Swift實(shí)現(xiàn)監(jiān)聽(tīng)鍵盤(pán)通知及一些處理詳解

    Swift實(shí)現(xiàn)監(jiān)聽(tīng)鍵盤(pán)通知及一些處理詳解

    這篇文章主要給大家介紹了關(guān)于Swift實(shí)現(xiàn)監(jiān)聽(tīng)鍵盤(pán)通知及一些處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Swift中閉包實(shí)戰(zhàn)案例詳解

    Swift中閉包實(shí)戰(zhàn)案例詳解

    接觸過(guò)Swift的小伙伴對(duì)“閉包”應(yīng)該不陌生,相當(dāng)于OC中的Block,是Swift語(yǔ)法中比較難理解的一塊。下面這篇文章主要介紹了關(guān)于Swift中閉包實(shí)戰(zhàn)的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-03-03
  • 利用swift實(shí)現(xiàn)卡片橫向滑動(dòng)動(dòng)畫(huà)效果的方法示例

    利用swift實(shí)現(xiàn)卡片橫向滑動(dòng)動(dòng)畫(huà)效果的方法示例

    卡片橫向滑動(dòng)動(dòng)畫(huà)效果相信對(duì)大家來(lái)說(shuō)都不陌生,下面這篇文章主要給大家介紹了關(guān)于利用swift實(shí)現(xiàn)卡片橫向滑動(dòng)動(dòng)畫(huà)效果的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-07-07
  • swift?framework使用OC?代碼兩種方式示例

    swift?framework使用OC?代碼兩種方式示例

    這篇文章主要為大家介紹了swift?framework使用OC?代碼兩種方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Swift之for循環(huán)的基礎(chǔ)使用學(xué)習(xí)

    Swift之for循環(huán)的基礎(chǔ)使用學(xué)習(xí)

    這篇文章主要為大家介紹了Swift之for循環(huán)的基礎(chǔ)學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Swift讀取App的版本信息與PCH文件詳解

    Swift讀取App的版本信息與PCH文件詳解

    這篇文章主要介紹了Swift讀取App的版本信息與PCH文件的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-03-03
  • 探討Swift數(shù)組和字典

    探討Swift數(shù)組和字典

    Swift數(shù)組是具體的。他不同于Objective-C的的NSArray和NSMutableArray里的類(lèi),它可以存儲(chǔ)任何類(lèi)型的對(duì)象,不提供有關(guān)它們返回的對(duì)象的性質(zhì)的任何信息
    2015-12-12
  • Swift中風(fēng)味各異的類(lèi)型擦除實(shí)例詳解

    Swift中風(fēng)味各異的類(lèi)型擦除實(shí)例詳解

    你也許曾聽(tīng)過(guò)類(lèi)型擦除,甚至也使用過(guò)標(biāo)準(zhǔn)庫(kù)提供的類(lèi)型擦除類(lèi)型如 AnySequence,下面這篇文章主要給大家介紹了關(guān)于Swift中風(fēng)味各異的類(lèi)型擦除的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Swift 4.2使用self做為變量名淺析

    Swift 4.2使用self做為變量名淺析

    這篇文章主要給大家介紹了關(guān)于Swift 4.2使用self做為變量名的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Swift代碼實(shí)現(xiàn)冒泡排序算法的簡(jiǎn)單實(shí)例

    Swift代碼實(shí)現(xiàn)冒泡排序算法的簡(jiǎn)單實(shí)例

    冒牌排序可謂最基本的排序算法之一,穩(wěn)定而沒(méi)有優(yōu)化空間:D 下面就一起來(lái)看一下Swift代碼實(shí)現(xiàn)冒泡排序算法的簡(jiǎn)單實(shí)例:
    2016-06-06

最新評(píng)論

南平市| 南漳县| 永定县| 鸡西市| 靖边县| 军事| 惠水县| 梅河口市| 滦平县| 米易县| 成武县| 宁河县| 名山县| 高安市| 洪洞县| 台山市| 庆云县| 峨山| 阳城县| 嘉禾县| 登封市| 留坝县| 新丰县| 汶川县| 从江县| 湟中县| 仙居县| 乐昌市| 金溪县| 平邑县| 抚州市| 衡阳市| 龙里县| 岳阳市| 镇平县| 黄浦区| 浦江县| 若羌县| 宁远县| 苍南县| 行唐县|