【Swift】 Collections初識 - Array(二)

聲明:此博客是本人在泊學(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]
    }
}
a的結(jié)果

很亂是不是!?
所以flatMap的作用就來了

let b = arr.flatMap { num in
    return arr2.map { word in
        return [word: num]
    }
}
b的結(jié)果

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),那請看下一篇 造輪子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Array [TOC] 如何創(chuàng)建Array 定義空數(shù)組 定義空數(shù)組并指定初始值 兩個常用的Array屬性 .cou...
    Jesmine陽閱讀 10,186評論 0 10
  • 53.計算字符 在字符串中獲取字符值的數(shù)量, 可以使用字符串字符屬性中的計數(shù)屬性: let unusualMena...
    無灃閱讀 1,269評論 0 4
  • 數(shù)組是一種可變的、可索引的數(shù)據(jù)集合。在Scala中用Array[T]的形式來表示Java中的數(shù)組形式 T[]。 v...
    時待吾閱讀 1,066評論 0 0
  • 愛麗絲孟游記閱讀 171評論 0 0
  • 獨臥床頭問幾更,萬家燈火無人回 吾家室友鼾如雷,怕是夢中與人會
    小七一閱讀 144評論 0 0

友情鏈接更多精彩內(nèi)容