欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

map

對于 map 函數(shù),使用場景就是將數(shù)組的類型映射為別的類型。比如,我們有一個(gè)模型數(shù)組,模型的 id 字段我們從服務(wù)器拿的是 String 類型,在某種場景下我們需要轉(zhuǎn)為 Int 類型,這時(shí)候我們就可以通過 map 函數(shù)來實(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)]

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

compactMap

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

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

這時(shí),我們再打印 intIds 就會發(fā)現(xiàn)它已經(jīng)為 Int 類型了。

compactMapValues

對于 Set 和 Array ,你可以使用 compactMap 來獲得非空的集合,但是對于 Dictionary 來說,這個(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ù)來獲得非空的字典。

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

flatMap

對于 flatMap,主要的應(yīng)用場景就是你想獲得一個(gè)單層集合的數(shù)組。通過下面的代碼來看一下 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 會直接將元素放在數(shù)組中,而 flatMap 會將元素平鋪在一個(gè)數(shù)組中。實(shí)際上,s.flatMap(transform) 等同于s.map(transform).joined()。

filter

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

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

reduce

對于 reduce,我們的使用場景就是對數(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é)果返回。

組合使用

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

將 String 類型映射為 Int 類型,并查找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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Swift仿微信語音通話最小化時(shí)后的效果實(shí)例代碼

    Swift仿微信語音通話最小化時(shí)后的效果實(shí)例代碼

    這篇文章主要介紹了Swift仿微信語音通話最小化時(shí)后的效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • iOS中Swift指觸即開集成Touch ID指紋識別功能的方法

    iOS中Swift指觸即開集成Touch ID指紋識別功能的方法

    隨著移動支付時(shí)代的到來,Touch ID 指紋驗(yàn)證迅速被支付寶,微信錢包普及,相信各位朋友使用后也大呼方便。下面給大家分享iOS中Swift指觸即開集成Touch ID指紋識別功能的方法,一起看看吧
    2017-03-03
  • swift中c風(fēng)格的for循環(huán)執(zhí)行效率

    swift中c風(fēng)格的for循環(huán)執(zhí)行效率

    這篇文章主要介紹了swift中c風(fēng)格的for循環(huán)執(zhí)行效率 的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • 詳解swift中xcworkspace多項(xiàng)目管理

    詳解swift中xcworkspace多項(xiàng)目管理

    給大家詳細(xì)講解了IOS開發(fā)中swift語言xcworkspace多項(xiàng)目管理的方法和介紹,一起參考一下。
    2017-11-11
  • Swift如何調(diào)用Objective-C的可變參數(shù)函數(shù)詳解

    Swift如何調(diào)用Objective-C的可變參數(shù)函數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于Swift如何調(diào)用Objective-C的可變參數(shù)函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • 判斷?ScrollView List?是否正在滾動詳解

    判斷?ScrollView List?是否正在滾動詳解

    這篇文章主要為大家介紹了判斷?ScrollView、List?是否正在滾動示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • swift閉包和OC block類型的使用

    swift閉包和OC block類型的使用

    這篇文章主要介紹了swift閉包和OC block類型的使用,需要的朋友可以參考下
    2017-08-08
  • openstack重啟swift服務(wù)后報(bào)錯(cuò)問題解決方案

    openstack重啟swift服務(wù)后報(bào)錯(cuò)問題解決方案

    這篇文章主要介紹了解決openstack重啟swift服務(wù)后報(bào)錯(cuò),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Swift實(shí)現(xiàn)“或”操作符的3種方法示例

    Swift實(shí)現(xiàn)“或”操作符的3種方法示例

    這篇文章主要給大家介紹了關(guān)于Swift實(shí)現(xiàn)“或”操作符的3種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 分享十條實(shí)用的Swift小提示

    分享十條實(shí)用的Swift小提示

    是時(shí)候使用易入手又全面的Swif語言為iOS和mac OS X做應(yīng)用開發(fā)了,下面這篇文章主要給大家分享介紹了十條實(shí)用的Swift小提示的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧
    2018-06-06

最新評論