1. 程式人生 > 其它 >Swift文件Chapter 4 集合型別

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()方法獲得排序後的陣列。