Swift中Array高階函數(shù)的使用

前言

在Swift中恢总,有關(guān)于Array的高階函數(shù)。這一點和JavaScript是一樣的杠愧。也就是說利朵,Swift也是支持函數(shù)式編程的律想。

關(guān)于Array有以下幾個高階函數(shù):filter map reduce flatMap compactMap。其中前三個和JavaScript語言是一樣的绍弟,不同的是語法不同而已技即。下面我們就來探索一下這5個高階函數(shù)。掌握了這些高階函數(shù)樟遣,可以讓我們對于一些關(guān)于數(shù)組處理更加得心應(yīng)手而叼。

實踐

  • filter函數(shù):過濾郭脂,將數(shù)組中的元素按照一定的條件進(jìn)行過濾 返回過濾后新數(shù)組
    • 傳入函數(shù)/閉包表達(dá)式
    • 該函數(shù)/閉包表達(dá)式會執(zhí)行n次,n代表數(shù)組中元素個數(shù)
    • 該函數(shù)/閉包表達(dá)式 必須返回Bool類型
    • 該函數(shù)/閉包表達(dá)式 接收一個參數(shù)澈歉,該參數(shù)就是每次遍歷的數(shù)組中元素
    • 如果函數(shù)/閉包表達(dá)式返回值是true 就把該元素放入新的數(shù)組
    • 如果函數(shù)/閉包表達(dá)式返回值是false 該元素就會被過濾掉
let array = [1, 2, 3, 4]
let newArray = array.filter { (n) -> Bool in
    return n % 2 == 0
}
print(newArray) // [2, 4]

// 利用Swift語言的語法糖 上面的代碼還可以進(jìn)行進(jìn)一步的簡化
let newArray = array.filter { $0 % 2 == 0 }
print(newArray) // [2, 4]
  • map函數(shù):將數(shù)組中元素進(jìn)行映射處理,返回處理過后的新數(shù)組
    • 傳入函數(shù)/閉包表達(dá)式
    • 該函數(shù)/閉包表達(dá)式會執(zhí)行n次屿衅,n代表數(shù)組中元素個數(shù)
    • 該函數(shù)/閉包表達(dá)式接收一個參數(shù)埃难,該參數(shù)就是每次遍歷的數(shù)組元素
    • 該函數(shù)/閉包表達(dá)式返回處理后的內(nèi)容,將處理后的內(nèi)容添加到新的數(shù)組中(映射操作)
let array = [1, 2, 3, 4]
let newArray = array.map { n in
    return n * 2
}
print(newArray) // [2, 4, 6, 8]

// 簡寫
let newArray = array.map { $0 * 2 }
print(newArray) // [2, 4, 6, 8]
  • reduce函數(shù):應(yīng)用場景:匯總或者數(shù)組中每個元素的值和前一個值有關(guān)聯(lián)的處理
    • 傳入初始值和一個函數(shù)/閉包表達(dá)式
    • 該函數(shù)/閉包表達(dá)式會執(zhí)行n次涤久,n代表數(shù)組中元素個數(shù)
    • 該函數(shù)/閉包表達(dá)式接收2個參數(shù)涡尘,上一次遍歷匯總的結(jié)果,和數(shù)組中的元素
    • 將匯總的結(jié)果作為返回值返回
let array = [1, 2, 3, 4]
let result = array.reduce(0) { (previousResult, n) in
    return previousResult + n
}
print(result) // 10

// 簡寫
let result = array.reduce(0) { $0 + $1 }
print(result) // 10
  • flatMap:和map對比著來理解
    • flatMap傳入的函數(shù)/閉包表達(dá)式 必須返回sequence類型
    • 最終的返回值將sequence中的元素放入到新的數(shù)組中
    • 而map傳入的函數(shù)/閉包表達(dá)式 直接將數(shù)組作為元素放入到新的數(shù)組中
let array = [1, 2, 3, 4]
let newArray = array.map { n in
    return Array(repeating: n, count: n)
}
print(newArray) // [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]

let newArray2 = array.flatMap { n in
    return Array(repeating: n, count: n)
}
print(newArray2) // [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]

// 簡寫
let newArray = array.flatMap { Array(repeating: $0, count: $0) }
print(newArray) // [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
  • compactMap:和map對比著理解
    • compactMap在進(jìn)行元素映射的時候响迂,會將nil過濾掉考抄,并且會將可選項進(jìn)行解包
let array = ["1", "flutter", "3", "Vue"]

let newArray = array.map { item in
    return Int(item)
}
print(newArray) // [Optional(1), nil, Optional(3), nil]

let newArray2 = array.compactMap { item  in
    return Int(item)
}

print(newArray2) // [1, 3]

// 簡寫
let newArray = array.compactMap { Int($0) }
print(newArray) // [1, 3]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔗彤,隨后出現(xiàn)的幾起案子川梅,更是在濱河造成了極大的恐慌,老刑警劉巖然遏,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贫途,死亡現(xiàn)場離奇詭異,居然都是意外死亡待侵,警方通過查閱死者的電腦和手機(jī)丢早,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秧倾,“玉大人怨酝,你說我怎么就攤上這事∧窍龋” “怎么了农猬?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胃榕。 經(jīng)常有香客問我盛险,道長,這世上最難降的妖魔是什么勋又? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任苦掘,我火速辦了婚禮,結(jié)果婚禮上楔壤,老公的妹妹穿的比我還像新娘鹤啡。我一直安慰自己,他們只是感情好蹲嚣,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布递瑰。 她就那樣靜靜地躺著祟牲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抖部。 梳的紋絲不亂的頭發(fā)上说贝,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音慎颗,去河邊找鬼乡恕。 笑死,一個胖子當(dāng)著我的面吹牛俯萎,可吹牛的內(nèi)容都是我干的傲宜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼夫啊,長吁一口氣:“原來是場噩夢啊……” “哼函卒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撇眯,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤报嵌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叛本,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沪蓬,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年来候,在試婚紗的時候發(fā)現(xiàn)自己被綠了跷叉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片话浇。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡绰沥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哺哼,到底是詐尸還是另有隱情转质,我是刑警寧澤园欣,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站休蟹,受9級特大地震影響沸枯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赂弓,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一绑榴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盈魁,春花似錦翔怎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飘痛。三九已至,卻和暖如春容握,著一層夾襖步出監(jiān)牢的瞬間宣脉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工剔氏, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留脖旱,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓介蛉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親溶褪。 傳聞我的和親對象是個殘疾皇子币旧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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