Swift高階函數(shù)

Swift高階函數(shù)是指可以接受函數(shù)作為參數(shù)或返回函數(shù)的函數(shù)羽峰。高階函數(shù)強(qiáng)調(diào)了函數(shù)的參數(shù)和返回值都可以是函數(shù)類型,這使得函數(shù)能夠被視為可傳遞和可組合的值和運(yùn)算园蝠。

Swift中有多種高階函數(shù)渺蒿,包括mapfilter彪薛,reduce茂装,sortflatMap善延,compactMap等少态。

1. Map

map是高階函數(shù)中最常用的函數(shù)之一。它接受一個(gè)函數(shù)和一個(gè)數(shù)組易遣,并返回一個(gè)新數(shù)組彼妻,其中每個(gè)元素都是原始數(shù)組中對(duì)應(yīng)元素通過(guò)輸入的函數(shù)轉(zhuǎn)換后得到的結(jié)果。

以下是一個(gè)簡(jiǎn)單示例豆茫,將一個(gè)數(shù)組中的每個(gè)元素加倍:

let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
print(doubled) 
// prints [2, 4, 6, 8, 10]

2. Filter

filter函數(shù)接受一個(gè)函數(shù)和一個(gè)數(shù)組侨歉,并返回一個(gè)新數(shù)組,其中只包含原始數(shù)組中符合條件的元素揩魂。這個(gè)函數(shù)可以用于過(guò)濾數(shù)組中不需要的元素幽邓。

以下是一個(gè)簡(jiǎn)單示例,從一個(gè)字符串?dāng)?shù)組中過(guò)濾出包含大寫字母的字符串:

let words = ["apple", "banana", "CAT", "dog", "EGG"]
let capitalized = words.filter { word in
    let pattern = ".*[A-Z]+.*"
    let range = word.range(of: pattern, options: .regularExpression)
    return range != nil
}
print(capitalized) 
// prints ["CAT", "EGG"]

3. Reduce

reduce函數(shù)接受一個(gè)函數(shù)和一個(gè)數(shù)組火脉,并返回一個(gè)單一的值牵舵,這個(gè)值是通過(guò)使用指定的函數(shù)對(duì)數(shù)組中的所有元素進(jìn)行聚合得到的。這個(gè)函數(shù)可以用于計(jì)算數(shù)組中所有元素的總和或平均值等倦挂。

以下是一個(gè)簡(jiǎn)單示例畸颅,計(jì)算一個(gè)數(shù)組中所有元素的總和:

let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0, { $0 + $1 })
print(sum) 
// prints 15

上面的例子在reduce函數(shù)的初始化值參數(shù)中指定了一個(gè)初始值0,reduce函數(shù)對(duì)該數(shù)組中的所有元素進(jìn)行了求和操作妒峦。reduce函數(shù)中的第二個(gè)參數(shù)是一個(gè)閉包重斑,用于對(duì)數(shù)組中的每個(gè)元素進(jìn)行操作。

4. Sorted

sorted函數(shù)接受一個(gè)數(shù)組肯骇,并返回一個(gè)新數(shù)組窥浪,其中所有元素都按照指定的順序排列。這個(gè)函數(shù)可以用于對(duì)數(shù)組中的元素進(jìn)行排序操作笛丙。

以下是一個(gè)簡(jiǎn)單示例漾脂,對(duì)一個(gè)包含人員信息的數(shù)組按照年齡從小到大排序:

let people = [("Alice", 20), ("Bob", 18), ("Charlie", 25), ("David", 22)]
let sortedPeople = people.sorted { (person1, person2) in
    return person1.1 < person2.1
}
print(sortedPeople)
// prints [("Bob", 18), ("Alice", 20), ("David", 22), ("Charlie", 25)]

在這個(gè)例子中,我們傳遞了一個(gè)閉包作為sorted函數(shù)的參數(shù)胚鸯,這個(gè)閉包用于比較元組中的第二個(gè)元素(年齡)骨稿,成升序排列。

5. FlatMap

flatMap接受一個(gè)數(shù)組姜钳,然后將每個(gè)元素映射為新的數(shù)組坦冠,并將所有結(jié)果組合成一個(gè)單一的數(shù)組。與map不同哥桥,在使用flatMap時(shí)辙浑,元素可以映射到一個(gè)可選類型的數(shù)組,從而更加靈活拟糕。

以下是一個(gè)簡(jiǎn)單示例判呕,將一個(gè)含有字符串的數(shù)組轉(zhuǎn)換成一個(gè)包含所有單詞的數(shù)組:

let phrases = ["hello world", "goodbye cruel world"]
let words = phrases.flatMap { $0.split(separator: " ") }
print(words) 
// prints ["hello", "world", "goodbye", "cruel", "world"]

在這個(gè)例子中,首先使用split函數(shù)將字符串分割成單詞數(shù)組送滞,然后使用flatMap將多個(gè)數(shù)組合并為一個(gè)數(shù)組侠草。

6. CompactMap

compactMap通過(guò)一個(gè)閉包參數(shù)來(lái)轉(zhuǎn)化數(shù)組中的每個(gè)元素,并返回一個(gè)新的數(shù)組犁嗅,其中nil值會(huì)被過(guò)濾掉边涕。這個(gè)閉包必須返回一個(gè)可選類型值,當(dāng)返回值為nil時(shí)褂微,元素將被過(guò)濾掉奥吩。

例如:

let items = [1, 2, 3, 4, 5]

let mappedItems = items.map { $0 * 2 }
print(mappedItems) 
// prints [2, 4, 6, 8, 10]

let compactMappedItems = items.compactMap { $0 % 2 == 0 ? $0 : nil }
print(compactMappedItems) 
// prints [2, 4]

在上面的例子中,我們將數(shù)組中的元素乘以 2 進(jìn)行了映射蕊梧,產(chǎn)生了一個(gè)新的數(shù)組霞赫。然后我們使用compactMap過(guò)濾掉了奇數(shù)元素,只剩下了偶數(shù)元素 2 和 4肥矢。

One more Thing

Swift高階函數(shù)的另一個(gè)強(qiáng)大之處在于它們可以鏈接在一起形成一個(gè)管道端衰,這被稱為函數(shù)鏈或函數(shù)式編程范式。使用函數(shù)鏈甘改,我們可以通過(guò)將多個(gè)函數(shù)應(yīng)用于同一個(gè)數(shù)組來(lái)生成一個(gè)復(fù)雜的旅东、自定義的操作序列。

以下是一個(gè)簡(jiǎn)單示例十艾,將一個(gè)字符串?dāng)?shù)組中的大寫字母轉(zhuǎn)換為小寫字母抵代,并按字母順序排序:

let words = ["AbC", "deF", "ghi", "JKL"]
let result = words
    .map { $0.lowercased() }
    .filter { $0.count <= 3 }
    .sorted()
print(result) 
// prints ["abc", "def", "ghi"]

在這個(gè)例子中,我們調(diào)用了串聯(lián)式的map忘嫉、filtersorted函數(shù)荤牍,它們?cè)谝黄鹦纬闪艘粋€(gè)管道案腺,每個(gè)函數(shù)都返回一個(gè)新的數(shù)組,以形成復(fù)合操作康吵。

通過(guò)函數(shù)鏈劈榨,我們可以創(chuàng)建與原始數(shù)據(jù)完全不同的結(jié)果,并且所需的代碼量非常少晦嵌。使用高階函數(shù)以及函數(shù)鏈編程方式同辣,可以使代碼更加可讀性強(qiáng),更加易于維護(hù)和測(cè)試惭载。

總之旱函,高階函數(shù)是Swift語(yǔ)言中非常強(qiáng)大和靈活的工具,可以大大簡(jiǎn)化代碼描滔,并提高代碼的可讀性和可維護(hù)性棒妨。掌握這些高階函數(shù),可以讓我們更快地構(gòu)建高效伴挚、簡(jiǎn)潔的代碼靶衍。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市茎芋,隨后出現(xiàn)的幾起案子颅眶,更是在濱河造成了極大的恐慌,老刑警劉巖田弥,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涛酗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡偷厦,警方通過(guò)查閱死者的電腦和手機(jī)商叹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)只泼,“玉大人剖笙,你說(shuō)我怎么就攤上這事∏氤” “怎么了弥咪?”我有些...
    開(kāi)封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)十绑。 經(jīng)常有香客問(wèn)我聚至,道長(zhǎng),這世上最難降的妖魔是什么本橙? 我笑而不...
    開(kāi)封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任扳躬,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贷币。我一直安慰自己击胜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布片择。 她就那樣靜靜地躺著潜的,像睡著了一般骚揍。 火紅的嫁衣襯著肌膚如雪字管。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天信不,我揣著相機(jī)與錄音嘲叔,去河邊找鬼。 笑死抽活,一個(gè)胖子當(dāng)著我的面吹牛硫戈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播下硕,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼丁逝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了梭姓?” 一聲冷哼從身側(cè)響起霜幼,我...
    開(kāi)封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎誉尖,沒(méi)想到半個(gè)月后罪既,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铡恕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年琢感,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片探熔。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驹针,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诀艰,到底是詐尸還是另有隱情柬甥,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布涡驮,位于F島的核電站暗甥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捉捅。R本人自食惡果不足惜撤防,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棒口。 院中可真熱鬧寄月,春花似錦辜膝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至克懊,卻和暖如春忱辅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谭溉。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工墙懂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扮念。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓损搬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親柜与。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巧勤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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