Swift文件Chapter 4 集合型別
Swift提供了3種基本的集合型別:
Arrays
:有序資料的集;Sets
:無序無重複資料的集;Dictionaries
:無序鍵值對的集。
以上型別都被實現為泛型集合。
集合的可變性
以上型別分配為變數,這個集合就是可變的。我們可以新增或者移除存在的資料項。如果分配成常量,那就是不可變的,大小和內容都不可以改變。
陣列(Arrays)
陣列使用有序列表儲存同一型別多個值。相同的值可以多次出現在同一陣列的不同位置中。
陣列的定義
陣列的定義包含兩種方式:
Array[Element]
定義;[Element]
定義。
本文推薦使用第二種方式定義,以下是一個整數陣列的定義:
var someInts = [Int]()
如果說程式碼上下文提供了型別資訊,例如函式引數或者已經定義好了型別的變數或者常量,我們可以直接使用[]
建立空陣列:
someInts.append(3)
someInts = []
建立一個帶預設值的陣列
可以使用repeating
引數傳入初始值,count
引數傳入陣列大小:
var threeDoubles = Array(repeating: 0.0, count: 3)
//這是一個[Double]陣列,等價於[0.0, 0.0, 0.0]
在陣列中使用+
兩個相同型別的陣列使用+
會直接連線起來,得到新陣列型別會直接推斷出來,不需要宣告。
用陣列字面量構造陣列
陣列的字面量是一系列由逗號分隔並由方括號包裹著的值:[value1, value2, value3]
訪問和修改陣列
count
:獲取陣列元素的數量;isEmpty
:判斷count
是否為0的縮寫形式;append(_:)
:在陣列後新增新的資料項;+=
:可以直接合並兩個陣列;[index]
:陣列由下標直接訪問,從0開始計數,也可以改變已有索引值的值。也可以使用一個範圍改變陣列內陣列,即使新資料和原有資料個數不一樣(直接頂替);insert(_:at:)
:在某個索引值之前加入資料;remove(at:)
:移除這個索引值的資料並返回這個資料;removeLast()
:直接移除陣列最後一項,避免索引。
陣列的遍歷
可以使用for-in
直接遍歷陣列。如果需要每一個數據項以及索引值,那麼可以使用enumerated()
集合(Sets)
**集合(Sets)**儲存相同型別並且沒有確定順序的值。當元素順序不重要並且每個元素只出現一次使用集合而不是陣列。
集合型別的雜湊值
儲存在集合型別的值必須書可雜湊化的。必須可以提供一個方法計算他的雜湊值。雜湊值為Int
型別,相等型別雜湊值相同:如果a==b
那麼a.hashValue==b.hashValue
。
Swift所有的基本型別都是可雜湊化的。
集合型別語法
集合的生命方式是Set<Element>
。集合沒有對應的簡化形式。
使用構造器構造一個空集合的方式是:
var letters = Set<Character>()
如果可以通過上下文推斷集合型別,那麼可以直接使用[]
宣告一個空集合型別。
使用陣列字面量建立集合
陣列字面量可以建立集合,當宣告為集合型別時,可以直接使用陣列字面量賦初值。
Set
型別不能夠直接推斷出來,必須顯式的宣告型別。
訪問和修改一個集合
count
:獲取集合元素的數量;isEmpty
:判斷count
是否為0的縮寫形式;insert(_:)
:在集合中新增新的資料項;remove(_:)
:刪除集合中一個元素,如果包含這個元素就返回這個元素,如果不包含就返回nil
;removeAll(_:)
:刪除集合中所有元素;contains(_:)
:檢查集合中是否包含這個值。
遍歷一個集合
可以使用for-in
進行遍歷。但是集合沒有順序,如果要按照順序訪問,需要使用sorted()
方法返回一個有序陣列,這個陣列的順序是按照<
的比較順序。
集合操作
集合可以實現基本的集合操作。
intersection(_:)
:計算兩個集合的交集;symmetricDifference(_:)
:計算兩個集合的對等茶分集;union(_:)
:計算兩個集合的並集;subtracting(_:)
:計算兩個集合的差集。
集合成員的關係和相等
==
:兩個集合的元素是否元素完全相等;isSubset(of:)
:判斷一個集合是否是另一個集合的子集;isSuperset(of:)
:判斷一個集合是否是另一個集合的父集;isStrictSubset(of:)
:判斷一個集合是否是另一個集合的嚴格子集(兩個集合不可以相等);isStrictSuperset(of:)
:判斷一個集合是否是另一個集合的嚴格父集(兩個集合不可以相等);isDisjoint(with:)
:判斷兩個集合是否不含有相同的值(是否沒有交集)。
字典(Dictionaries)
**字典(Dictionaries)**是一個儲存多個相同型別值的容器。每一個值(value)都有對應的鍵值(key)。我們通過鍵值訪問對應的資料。
字典型別建立
字典型別有兩種建立方法:
- 使用
Dictionary<Key, Value>
; - 使用
[Key: Value]
。
本文主要使用第二種方式。如果上下文可以推斷出字典的型別,可以直接使用[:]
建立一個空字典。
字典型別的字面量
字典型別字面量是由一對一對被逗號分隔,被方括號包裹的鍵值對。鍵值對是由鍵值(key)和資料(value)組成的,[key1: value1, key2: value2, key3: value3]
。字典型別可以進行推斷。
訪問和修改字典
count
:獲取字典元素的數量;isEmpty
:判斷count
是否為0的縮寫形式;[key]
:下標訪問獲得對應的數值,也可以進行修改,如果不存在對應值,那麼返回nil
,字典返回的是一個可選值,需要解包使用。如果給一個鍵賦值為nil
,那麼這個鍵對應的值將會刪除;updateValue(_:forKey:)
:更新鍵值對應的資料,如果這個值不存在,會加入新值或者更新原有值並返回舊值。返回型別是可選型別,如果不存在舊值,那麼返回nil
;removeValue(forKey:)
:移除對應鍵值和資料,如果不存在舊值,返回nil
,否則返回舊值。
字典的遍歷
可以使用for-in
遍歷字典,返回值是元組,包含鍵值和資料。可以使用keys
屬性和values
屬性獲得字典的鍵值和資料。並且可以使用型別轉換轉換成陣列型別。兩個屬性也可以使用sorted()
方法獲得排序後的陣列。