Swift數(shù)組的幾個(gè)好用的方法

分享一下Swift中數(shù)組的幾個(gè)好用的方法诫隅,他們都是通過(guò)閉包來(lái)調(diào)用愈捅,使用起來(lái)很方便损同、高效:

1翩腐、map

對(duì)數(shù)組的操作,經(jīng)常會(huì)需要遍歷數(shù)組中的每個(gè)元素膏燃,我們有常見(jiàn)的做法:

for 的快速遍歷:

let array = ["a","b","c","d","e","f"]

for item in array {

print(item)

}

for 的這種OC經(jīng)典寫(xiě)法茂卦,在Swift中已經(jīng)棄用:

for (var index = 0; index < array.count; index ++) {

print(array[index])

}

如果想在遍歷的過(guò)程得到每個(gè)元素的索引下標(biāo),可以這樣:

for index in 0...array.count-1 {

print(array[index])

}

還有一個(gè)方法:

for (index,value) in array.enumerated() {

print(index,value)

}

再調(diào)用 reversed 方法還可以反向遍歷:

for (index,value) in array.enumerated().reversed() {

print(index,value)

}

下面要介紹的是map方法:

public func map(_ transform: (Element) throws -> T) rethrows -> [T]

map函數(shù)以一個(gè)閉包函數(shù)作為參數(shù)组哩,返回一個(gè)新的數(shù)組等龙,編譯器會(huì)自動(dòng)根據(jù)調(diào)用它的數(shù)組類(lèi)型自動(dòng)推斷出返回?cái)?shù)組的類(lèi)型:

let newArray = array.map { (str) -> String in

return str+"1"

}

print("newArray: \(newArray)")

打印結(jié)果:

2、flatMap

flatMap方法是在map方法的基礎(chǔ)上增加了新的功能:

a伶贰、空值過(guò)濾

調(diào)用flatMap生成的新數(shù)組過(guò)濾掉了nil值的元素而咆,得到的新數(shù)組里面全部都是非nil得元素:

let array = ["a", "b", "c", nil]

let newArray = array.flatMap { $0 }

print("newArray: \(newArray)"

打印結(jié)果:

let newArray = array.flatMap { $0 }? 這種是最簡(jiǎn)潔的寫(xiě)法,$0 是參數(shù)名的縮寫(xiě)幕袱,$0暴备、$1、$2...依次代表閉包中的第1们豌、2涯捻、3...個(gè)參數(shù),我們可以依次還原它的最原始的寫(xiě)法:

b望迎、強(qiáng)解包

flatMap
會(huì)自動(dòng)幫我們做了解包的工作障癌,不用我們額外去解包元素,以map方法作對(duì)比:

let array: [String?] = ["abc", "de", "fgh"]

let newArray = array.map { $0 }

print("newArray: \(newArray)")

打印結(jié)果:

let array: [String?] = ["abc", "de", "fgh"]

let newArray = array.flatMap { $0 }

print("newArray: \(newArray)")

打印結(jié)果:

c辩尊、數(shù)組壓平

所謂壓平涛浙,其實(shí)就是把一個(gè)二維數(shù)組里面的元素(數(shù)組)展開(kāi)成一維數(shù)組:

let array = [["abc", "de"], ["fgh","ij"]]

let newArray = array.flatMap { $0 }

print("newArray: \(newArray)")

打印結(jié)果:

3、filter

一般在我們遍歷數(shù)組時(shí)可能都是為了過(guò)濾一些想要的數(shù)據(jù)摄欲,例如:我們想在array里面找到包含"a"字符的字符串轿亮,常規(guī)的做法:

let array = ["adl","er","kg","asl","fe","341a","vfl","ac"]

var newArray: [String] = []

for item in array {

if item.contains("a") {

newArray.append(item)

}

}

print("newArray: \(newArray)")

filter的用法就更加方便簡(jiǎn)潔:

public func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]

filter從字面上理解就是過(guò)濾,調(diào)用這個(gè)方法時(shí)胸墙,傳入一個(gè)閉包函數(shù)作為參數(shù)我注,給定判斷條件,可以得到一個(gè)新的符合條件的數(shù)組:

let newArray = array.filter { (str) -> Bool in

return str.contains("a")

}

print("newArray : \(newArray)")

打印結(jié)果:

4迟隅、first

這個(gè)方法類(lèi)似filter但骨,不同的是這個(gè)方法遍歷時(shí)匹配到一個(gè)滿(mǎn)足條件的元素就不會(huì)繼續(xù)遍歷下去励七,跳出循環(huán),也就是匹配到第一個(gè)就結(jié)束奔缠,如果確定數(shù)組中只有一個(gè)滿(mǎn)足條件的元素就可以用這個(gè)匹配方法掠抬,不用進(jìn)行其他多余的遍歷:

public func first(where predicate: (Element) throws -> Bool) rethrows -> Element?

例如:

let array = ["adl","er","kg","asl","fe","341a","vfl","ac"]

let item = array.first { (str) -> Bool in

let index = array.index(of: str)

print("index : \(index!)")

return str.contains("r")

}

print("filter item: \(item!)")

打印結(jié)果:

5、reduce

這個(gè)方法可以用于計(jì)算數(shù)組里面每個(gè)元素相加后的值:

public func reduce(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

let array = [1,4,7]

let initialResult = 0

let result = array.reduce(initialResult) { (tempResult, element) -> Int in

return tempResult + element

}

print("result: \(result)")

打印結(jié)果:

以上是個(gè)人見(jiàn)解校哎,如有不足或錯(cuò)誤两波,歡迎指教,謝謝贬蛙!??



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谚攒,隨后出現(xiàn)的幾起案子阳准,更是在濱河造成了極大的恐慌,老刑警劉巖馏臭,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件野蝇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡括儒,警方通過(guò)查閱死者的電腦和手機(jī)绕沈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)帮寻,“玉大人乍狐,你說(shuō)我怎么就攤上這事」潭海” “怎么了浅蚪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)烫罩。 經(jīng)常有香客問(wèn)我惜傲,道長(zhǎng),這世上最難降的妖魔是什么贝攒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任盗誊,我火速辦了婚禮,結(jié)果婚禮上隘弊,老公的妹妹穿的比我還像新娘哈踱。我一直安慰自己,他們只是感情好梨熙,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布嚣鄙。 她就那樣靜靜地躺著,像睡著了一般串结。 火紅的嫁衣襯著肌膚如雪哑子。 梳的紋絲不亂的頭發(fā)上舅列,一...
    開(kāi)封第一講書(shū)人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音卧蜓,去河邊找鬼帐要。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弥奸,可吹牛的內(nèi)容都是我干的榨惠。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盛霎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赠橙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起愤炸,我...
    開(kāi)封第一講書(shū)人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤期揪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后规个,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凤薛,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年诞仓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缤苫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡墅拭,死狀恐怖活玲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谍婉,我是刑警寧澤翼虫,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站屡萤,受9級(jí)特大地震影響珍剑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜死陆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一招拙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧措译,春花似錦别凤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至塌衰,卻和暖如春诉稍,著一層夾襖步出監(jiān)牢的瞬間蝠嘉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工杯巨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚤告,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓服爷,卻偏偏與公主長(zhǎng)得像杜恰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仍源,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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