分享一下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ò)誤两波,歡迎指教,謝謝贬蛙!??