数组和字典

1. 数组

所谓数组,就是将相同数据类型的元素,按照一定顺序进行排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分它们的变量集合,这个名字被称为数组名,编号称为数组的下标。

1.1 数组的创建

在Swift中,数据值在被存储进入某个数组之前,数据的类型必须明确,方法是通过显示类型标注或类型推断:

1
2
3
 let stringArray = Array<String>()
 let floatArray = [Float]()
 let intArray = [1, 2, 3, 4, 5]

在第一行代码中,通过使用命名型类型Array,创建了一个字符串类型的数组,其中SomeType是这个数组中唯一允许存在的数据类型。 第二行代码中,我们使用了像SomeType[]这样的简单语法,创建了一个类型为浮点数的数组floatArray。 前面两种方法都是通过显示的类型标注,创建指定类型的数组。在第三行代码中,通过给常量设置默认值,从而由Swift对其类型做出推断。因为所有值都是整数类型,所以数据的类型被推断为整形数组。

1.2 数组的访问与查找

数组中元素的访问,是通过下标语法实现的:

1
2
 let intArray = [1, 2, 3, 4, 5]
 print(intArray)  //结果为: 3

通过使用数组的只读属性count和isEmpty,可以获取数组中的元素数量:

1
2
 intArray.isEmpty  //判断数组是否为空,结果为: false
 intArray.count    //获得数组中元素的数量,结果为: 5

通过使用数据的contains()方法,可以判断数组中是否存在某个元素:

1
 intArray.contains(3)  //判断数组中是否存在3,结果为:true

1.3 数组的编辑

在Swift中,可以使用数组的append()方法,或者直接使用加号+,往已有的数组中添加新的元素。

1
2
3
 var intArray = [1, 2, 3, 4, 5]
 intArray += [6]    //intArray的元素: [1, 2, 3, 4, 5, 6]
 intArray.append(7) //intArray的元素: [1, 2, 3, 4, 5, 6, 7]

如果需要在数组的中间位置添加新元素,可以使用insert()方法,新的元素将被插入数组中指定的index位置,该位置原来的元素将依次右移。

1
 intArray.insert(100, at: 2)  //intArray的元素: [1, 2, 100, 3, 4, 5, 6, 7]

在Swift中修改数组中的某个元素,也是非常简单的。首先使用下标定位到需要修改的元素,然后直接给元素指定新的值即可。

1
 intArray[2] = 9  //intArray的元素: [1, 2, 9, 3, 4, 5, 6, 7]

使用这种方式,甚至可以一次性修改数组中的多个元素的值。

1
2
 intArray[3...5] = [8, 8, 8]  //intArray的元素: [1, 2, 9, 8, 8, 8, 6, 7]
 intArray[3...5] = [8]  //intArray的元素: [1, 2, 9, 8, 6, 7]

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

1
2
3
4
5
 intArray.removeFirst()    //intArray的元素: [2, 9, 8, 8, 8, 6, 7]
 intArray.removeLast()     //intArray的元素: [1, 2, 9, 8, 8, 8, 6]
 intArray.remove(at: 2)    //intArray的元素: [2, 9, 8, 8, 6]
 intArray.removeSubrange(Range(1..3)) //intArray的元素: [2, 8, 6]
 intArray.removeAll()     //intArray的元素: []

2. 多维数组

多维数组是指在数组中仍然存在其他的数组。 你可以将多维数组理解为,通过几次索引可以找到存储的值就为几维数组,例如在一维数组userList中,通过一个索引值userList[0],就可以查找到第一个用户。在二维数组userList2中,就需要进行两次索引userList[0][0],才可以查找到第一个用户。 多维数组的创建与一维数组类似,以下代码定义了一个包含整数元素的二维数组。

1
 var intArray = [[int]]()

同样可以通指定初始值的方法,创建了一个多维数组。

1
 let numbers = [[1, 2, 3],[4, 5, 6, 7]]

和一维数组一样,可以使用append()方法,往多维数组中添加更多的数组元素。

1
2
 var numbers = [[1, 2, 3],[4, 5, 6, 7]]
 numbers.append([8, 9, 10])  //numbers的元素:[[1, 2, 3], [4, 5, 6, 7], [8, 9, 10]]

那么如何获取多维数组中的元素呢?假如你需要获得numbers数组中的8这个数字,首先需要通过numbers[2]获得[8, 9, 10]数组,然后通过numbers[2][0]获得[8, 9, 10]数组中第一个元素。即通过numbers[2][0]获得第三个子数组中第一个元素:8。

3. 数组的遍历

在下面的代码中,使用..<符号,遍历数组从0~4之间的所有元素。

1
2
3
4
5
 var numbers = [1, 2, 3, 4, 5]
 for index in 0..<numbers.count
 {
     print(numbers[index])
 }

数组的遍历其实更加简单,例如:

1
2
3
4
5
 var numbers = [1, 2, 3, 4, 5]
 for num in numbers
 {
     print(num)
 }

对于包含复杂元素的数组进行遍历,也是非常简单的。

1
2
3
4
5
 let persons = ["paul": 32, "james": 33, "wade": 36]
 for(name, age) in persons
 {
     print("name=\(name),age=\(age)")
 }

通过for-in语句,也能方便的实现对多维数组的遍历,例如:

1
2
3
4
5
6
7
8
 var numbers = [[1, 2, 3], [4, 5, 6, 7]]
 for subNumbers in numbers
 {
     for number in subNumbers
     {
        print(number)
     }
 }

4. 字典

Swift语言提供两种集合类型来存储数据:数组和字典。数组是一个同类型的序列化列表集合;而字典是一个能够使用类似于键的唯一标识符来获取值的非序列化集合。 字典是一种存储多个相同类型的值的容器,每个值value都关联唯一的键key,键作为字典中的这个值数据的标识符。 和数组不同的是,字典中的元素并没有具体的顺粗,也就是说字典是无序存放元素的。在Swift中在某个特定字典中可以存储的键和值必须提前定义他们的类型,可以通过显性类型标注或者类型推断来定义键和值的类型。这意味着字典不会因为插入一个错误类型的值而导致程序出错,也意味着当你在字典中取回数值时,就能够确定它的类型。

4.1 字典的创建

Swift的字段写法时Dictionary,KeyType是你想要存储的键的数据类型,ValueType是你想要存储值的数据类型。这里的KeyType可以使用字符串String, 整型Int, 双精度Double和布尔Bool类型。

1
2
 var maps = Dictionary<String, String>()
 var maps2 = ["010": "北京", "021": "上海", "0519": "常州"]

在第一行代码中,maps被定义维Dictionary()类型,即这个字典的键和值的类型都是String。由于maps被定义为变量,所以你可以在之后的代码中,添加或编辑它的内容。 在第二行代码中,给maps2字典对象设置了初始值。由于在初始值中键和值的类型都是String,所以maps2的类型被推断为Dictionary()类型。

4.2 字典的读取和编辑

我们可以使用下标语法,通过在字典中设置的键获得相应的值。

1
2
 var maps = ["010": "北京", "021": "上海", "0519": "常州"]
 print(maps["010"])  // 输出的结果为:Optional("北京")

注意:如果想要获取“北京”具体指,可以在 Optional("北京")后面添加 !

通过下标语法,还可以往字典中添加新的元素。

1
2
3
 var maps = ["010": "北京", "021": "上海", "0519": "常州"]
 maps["020"] = "广东"
 print(maps["020"])  // 输出的结果为:Optional("广东")

如果下标中的键名已经存在与字典中,则会修改该键对应的值。

1
2
3
 var maps = ["010": "北京", "021": "上海", "0519": "常州"]
 maps["010"] = "广东"
 print(maps["010"])  // 输出的结果为:Optional("广东")

也可以使用字典中updateValue()方法,修改指定键的值。

1
2
3
 var maps = ["010": "北京", "021": "上海", "0519": "常州"]
 maps.updateValue("广东", forKey: "010")
 print(maps["010"])  // 输出的结果为:Optional("广东")

当需要删除某对键值时,可以使用removeValue()方法,或者将某个键的值置为nil, 也能起到相同的作用。以下两行代码,都能在字典中删除键为“010”的键值对。

1
2
 maps["010"] = nil
 maps.removeValue(forKey: "010")

4.3 字典的编辑

你可以使用for-in循环,来遍历某个字典中键或值,也可以同时遍历字典中的键值对。以下代码中,对字典的键进行了遍历操作。

1
2
3
4
5
  var maps = ["010": "北京", "021": "上海", "0519": "常州"]
  for key in maps.keys
  {
     print(key)
  }

类似的,也可以对字典中的值进行遍历操作。

1
2
3
4
5
  var maps = ["010": "北京", "021": "上海", "0519": "常州"]
  for value in maps.values
  {
     print(value)
  }

每一个字典中的数据项,都有(key, value)元组组成,所以你可以使用临时常量或者变量来分解这些元组,以下代码是对字典中的键值对进行遍历输出:

1
2
3
4
5
  var maps = ["010": "北京", "021": "上海", "0519": "常州"]
  for (key, value) in maps
  {
     print("key=\(key),value=\(value)")
  }