摘要訊息 : 學習 Swift 中的陣列和字典.

0. 前言

本文于 2022 年 3 月 17 日进行一次更新和修正. 修正之后本文已经归档, 不再享受更新.

1. 数组的基本操作

我們可以用

var type_array_1 = Array ()
var type_array_2 = [type]()
let int_array = [1, 2, 3, 4]

來定義數組. 其中, type 是数据类型.

数组的访问可以直接通过下标语法实现, 数组的第 i 个元素对应的下表为 i - 1 :

let int_array = [1, 2, 3, 4, 5]
print(int_array[1])    // 结果 : 2
print(int_array)    // 結果 : [1, 2, 3, 4, 5]
print(int_array.isEmpty)    // 判断数组是否为空, 结果 : false
print(int_array.count)    // 获得数组中元素的数量, 结果 : 5
print(int_array.contains(3))    // 判断数组中是否包含 3 这个元素, 结果 : true

Swift 中, 可以使用 append 或者 "+ [...]" 的方法对数组的元素进行增加; 可以使用 insert 在指定的位置增加某个元素; 可以直接通过下标定位到指定位置直接对元素进行修改. 另外, 還可以通过一个下标区间 [min_number ..< max_number] 或者 [min_number ... max_number] 对指定元素进行修改 :

var int_array = [1, 2, 3, 4, 5]
int_array.append(6)    // [1, 2, 3, 4, 5, 6]
int_array += [6]    // [1, 2, 3, 4, 5, 6, 6]
int_array.insert(100, at : 2)    // [1, 2, 100, 3, 4, 5, 6, 6]
int_array[0] = 0 // [0, 2, 100, 3, 4, 5, 6, 6]
int_array[3…6] = [1, 2, 3, 4]    // [0, 2, 100, 1, 2, 3, 4, 6]

Swift 数组提供了几种方法用来删除数组中的元素 :

var int_array = [0, 2, 100, 1, 2, 3, 4, 6]
int_array.removeFirst()    // [2, 100, 1, 2, 3, 4, 6]
int_array.removeLast()    // [2, 100, 1, 2, 3, 4]
int_array.remove(at : 2)    // [2, 100, 2, 3, 4]
int_array.removeSubrange(Range(1 ..< 3))    // [2, 3, 4]
int_array.removeAll()    // []

Swift 提供了 sort 函数对数组进行排序, 默认是升序. 當然, 可以通過添加相关参数可以实现对数组进行降序排序或者按照元组中的某一个元素进行排序 :

var int_array = [11, 22, 3, 14, 25]
int_array.sort()    // [3, 11, 14, 22, 25]
int_array.sort(by : >)    // [25, 22, 14, 11, 3]
var user_list = [(name : "Thomas", age : 20), (name : "John", age : 18), (name : "Bill", age : 28)]
user_list.sort(by : {$0.name > $1.name})    // [[(name : "Bill", age : 28), (name : "John", age : 18), (name : "Thomas", age : 20)]], 对 user_list 元组数组按照名字 name 的升序进行排序
user_list.sort(by : {$0.age < $1.age})    // userList == [[(name : "John", age : 18), (name : "Thomas", age : 20), (name : "Bill", age : 28)]], 对 user_list 元组数组按照年龄 age 的升序进行排序

2. 多維數組

在数组中仍然存在其他数组這樣的多维数组也被 Swift 支援, 通过几次索引可以找到存储的相关元素的具体值就是几维数组 :

let type_array = [[type_array]] ()    // k 维数组就有 k 个 []
let int_array = [[1, 2, 3], [4, 5, 6]]
var numbers = [[1, 2, 3], [1, 2, 3]]
numbers.append([4, 5, 6])    // [[1, 2, 3], [1, 2, 3], [4, 5, 6]]
print(numbers[2])    // 結果 : [1, 2, 3]

3. 數組的尋訪

我們一般通过 for-in 循环对数组遍历 :

var int_array = [1, 2, 3]
for index in 0..< int_array.count {
    print(index)
}
/* 结果 :
    1
    2
    3
*/
for index in int_array {
    print(index)
}
/* 结果 :
    1
    2
    3
*/
var int_array_2 = [1, 2, 3, 4, 5, 6]
let range = 3 ..< int_array_2.count
for index in zip(range, int_array_2[range]) {
    print(index)
}
/* 结果 :
    4
    5
    6
*/
let user_list = [(name : "Thomas", age : 20), (name : "John", age : 18), (name : "Bill", age : 28)]
for (name, age) in user_list {
    print(name + " 的年龄是 \(age).")
}
/* 结果 :
    Thomas 的年龄是 20.
    John 的年龄是 18.
    Bill 的年龄是 28.
*/
let multi_dimension_array = [[1, 2, 3], [4, 5, 6]]
for first_dimension in multi_dimension_array {
    for num in first_dimension {
        print(num)
    }
}
/* 结果 :
    1
    2
    3
    4
    5
    6
*/

4. 字典

字典就是索引帶有名稱的數組, 我們可以通過

let example = Dictionary <key_type, value_type> ()
let dialling_codes = ["010" : "Beijing", "021" : "Shanghai", "0592" : "Xiamen"]
print(dialling_codes["010"])    // 结果 : Beijing
dialling_codes["020"] = "Guangdong"    // ["010" : "Beijing", "021" : "Shanghai", "0592" : "Xiamen", "020" : Guangdong]
dialling_codes.updateValue("北京", forKey : "010")    // ["010" : "北京", "021" : "Shanghai", "0592" : "Xiamen", "020" : Guangdong]
dialling_codes.removeValue(forKey : "010")    // ["021" : "Shanghai", "0592" : "Xiamen", "020" : Guangdong]

其中, key_typevalue_type 为数据类型.

字典的尋訪和數組有很大不同, 分為對鍵和值 :

let dialling_codes = ["010" : "Beijing", "021" : "Shanghai", "0592" : "Xiamen"]
for key in dialling_codes {
    print(key)
}
/* 结果 :
    010
    021
    0592
*/
for value in dialling_codes {
    print(value)
}
/*结果 :
    Beijing
    Shanghai
    Xiamen
*/
for (key, value) in dialling_codes {
    print(key + " : " + value)
}
/*结果 :
    021 : Shanghai
    010 : Beijing
    0592 : Xiamen
*/