聲明:此博客是本人在泊學(xué)網(wǎng)學(xué)習(xí)Swift過程的筆記與心得
III. Array正確的訪問方式
如果使用了一段時間Swift的會發(fā)現(xiàn),Swift并不喜歡使用C風(fēng)格的遍歷循環(huán)方式,因為Swift提供了Optional的安全措施,而這些傳統(tǒng)C風(fēng)格方式并沒有很好地利用它,因此,Swift擁有自己的一套遍歷規(guī)則。
1.forEach
let arr = [1, 2, 3, 4, 5]
// 忘記C風(fēng)格的[]吧
for (int i=0; i<5; i++) { ... }
// 這才是Swift的Array的正確遍歷方式
for item in arr {
print("\(item)")
}
// or
arr.forEach { print("\($0)") }
而且,也可以通過Array.enumerated()來獲取一個EnumeratedSequence對象,為(index, value)的形式,包含索引與值
for (index, value) in arr.enumerated() {
print("arr[\(index)]: \(value)")
}
2.index
當想獲取固定index位置的值時,也無需通過[]的方式獲取
arr.index { $0 == 1 } // 2
這樣,如果index為1沒有值時(越界),也會返回nil而非crash,保證了安全
當然Swift也提供了關(guān)于index的多個API
arr.index(before: 1) // 1
arr.index(after: 1) // 3
arr.index(of: 1) // 0 (獲取of的值的index)
...
3.幾個特殊屬性
arr.first // 1
arr.last // 5
arr.min() // 1
arr.max() // 5
arr.popLast() // 5
arr.removeLast() // 4
值得注意的是,popLast()得到的是Optional類型,如果arr為空,則可以返回nil,而removeLast()則不會,只能等待crash的降臨吧!
4.filter
Swift中Array可以通過filter來篩選元素
arr.filter { $0 % 2 == 0 } // 篩選所有偶數(shù)
5.map
這樣的代碼經(jīng)常出現(xiàn)在項目中
var arrS = [Int]()
for value in arr {
arrS.append(value * value)
}
那么,map才是你的選擇
var arrM = arr.map { $0 * $0 }
簡單明了
此外,Swift也提供了一個flatMap的方式來打破閉包的Array返回值,當閉包的返回值是Array時,一旦我們進行嵌套操作,就會出現(xiàn)多維數(shù)組,而flatMap就是用來將多維數(shù)組變成一維數(shù)組的
let arr2 = ["A", "B", "C"]
let a = arr.map { num in
return arr2.map { word in
return [word: num]
}
}

很亂是不是!?
所以flatMap的作用就來了
let b = arr.flatMap { num in
return arr2.map { word in
return [word: num]
}
}

6.sorted
當給Array排序時,是否還在煩惱選擇冒泡還是快排等,那么,Swift中你只需要提供排序的規(guī)則,并實現(xiàn)Equaltable協(xié)議,就可以一步完成了
let arrSorted1 = arr.sorted(by: >)
let arrSorted2 = arr.sorted { $0 > $1 }
7.reduce
一般用于合并
let arrSum = arr.reduce(0, +) // 15 = 0 + 1 + 2 + 3 + 4 + 5
8.contains
當需要判斷Array中是否包含符合某些條件的元素時,可以使用contains,返回Bool類型結(jié)果
arr.contains { $0 % 2 == 0 } // 判斷是否包含偶數(shù) true
contains還有一個好處,就是遇到第一個符合條件的元素,就直接返回true跳出,極大的提高了效率
9.比較
當我們需要比較兩個數(shù)組是否相等時,我們也只需提供比較方法就可以便利的獲取兩個數(shù)組是否相等,for這個關(guān)鍵字就不需要出現(xiàn)了
let arrTemp = [0, 1, 2, 3, 4]
arr.elementsEqual(arrTemp, by: { $0 == $1 }) // false
arr.elementsEqual(arrTemp, by: { $0 == $1 + 1 }) // true
Swift還提供一個類似的API,判斷是否以特定元素序列開始的
arr.starts(with: [1, 2, 3], by: { $0 == $1 }) // true [1, 2, 3, ...]
如果這樣簡單的介紹,無法了解這些方法的內(nèi)部實現(xiàn),那請看下一篇 造輪子