3.4.1 数组
所谓数组,就是将相同数据类型的元素,按一定顺序进行排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分它们的变量集合,这个名字被称为数组名,编号称为数组的下标。
组成数组的各个变量称为数组的分量,也称为数组的元素,有时也被称为下标变量。Swift数组是在程序设计中,为了处理方便,把具有相同类型的若干变量,按有序的形式组织起来的一种形式,这些按序排列的同类数据元素的集合称为Swift数组。
Swift 数组对存储数据有具体要求。不同于Object-C的NSArray和NSMutableArray类,它们可以存储任何类型的实例,而且不提供他们返回对象的任何本质信息。
数组的创建
在Swift中,数据值在被存储进入某个数组之前,数据的类型必须明确,方法是通过显式的类型标注或类型推断:
1 let stringArray =Array<String>() 2 let floatArray = [Float]() 3 let intArry = [1,2,3,4,5]
在第一行代码中,通过使用命名型类型Array<SomeType>,创建了一个字符串类型的数组,其中SomeType是这个数组中唯一允许存在的数据类型。
在第二行代码中,我们使用了像SomeType[]这样的简单语法,创建了一个类型为浮点数的数组floatArray。
前面两种方法都是通过显示的类型标注,创建指定类型的数组。在第三行代码中,通过给常量设置默认值,从而由Swift对其类型作出推断。因为所有值都是整数类型,所以数组的类型被推断为整型数组。
数组的访问和查找
数组中元素的访问,是通过下标语法实现的:
1 let stringArray =Array<String>() 2 let floatArray = [Float]() 3 let intArry = [1,5]
通过使用数组的只读属性count和isEmpty,可以获取数组中的元素数量:
1 intArry.isEmpty //判断数组是否为空,结果为:false 2 intArry.count //获得数组中元素的数量,结果为:5
通过使用数组的contains()方法,可以判断数组中是否存在某个元素:
1 intArry.contains(3) //判断数组中是否存在3,结果为:true
数组的编辑
在Swift中,您可以使用数组的append()方法,或者直接使用加号+,往已有的数组中添加新的元素:
1 var intArry = [1,5] 2 intArry += [6] //intArray的元素:[1,5,6] 3 intArry.append(7) //intArray的元素:[1,6,7]
如果需要在数组的中间的位置添加新的元素,可以使用insert()方法,新的元素将被插入到数组中指定的index位置,该位置原来的元素将依次右移:
1 intArry.insert(100,at: 2) // intArray的元素:[1,100,7]
在Swift中修改数组中的某个元素,也是非常简单的。首先使用下标定位到需要修改的元素,然后直接给元素指定新的值即可:
1 intArry[2] = 9 // intArray的元素:[1,9,7]
使用这种方式,甚至可以一次性同时修改数组中的多个元素的值:
1 intArry[3...5] = [8,8,8] // intArray的元素:[1,7]
Swift数组提供了几种remove方法,用来删除数组中的元素:
1 intArry.removeFirst() // intArray的元素:[2,7] 2 intArry.removeLast() // intArray的元素:[2,6] 3 intArry. remove(at: 2) //intArray的元素:[2,6] 4 intArry.removeSubrange(Range(1..<3)) // intArray的元素:[2,6] 5 intArry.removeAll() // intArray的元素:[]
数组的排序
相对于Object-C语言来说,在Swift中对数组进行排序变得极为简单:
1 var intArry = [11,22,14,25] 2 print(intArry.sort()) // 输出的结果:[3,11,25]
sort()方法默认是按升序进行排列,如果想按照降序对数组进行排列:
1 intArry.sort(isOrderedBefore:>) // 输出的结果:[25,3]
对拥有复杂类型元素的数组进行排序,也是非常简单的,在下面的例子中,创建了一个包含三个元组对应的数组,并且按照元组中姓名的升序进行排列:
1 var userList = [(name: "Thomas",age: 20),(name: "John",age: 32),(name: " Bill",age: 28)] 2 userList.sort(isOrderedBefore:{$0.name > $1.name}) userList排序后的结果为:[("Bill",28),("John",32),("Thomas",20)]。
3.4.2 多维数组
多维数组是指在数组中,仍然存在其它的数组。
您可以将多维数组理解为,通过几次索引可以找到存储的值就为几维数组,例如在一维数组userList中,通过一个索引值userList [0],就可以查到第一个用户。在二维数组userList2,就需要两次索引userList [0][0],才可以查到第一个用户。
多维数组的创建,与一维数组类似,以下代码定义了一个包含整数元素的二维数组:
1 var intArray = [[Int]]()
同样可以通过指定初始值的方法,创建一个多维数组:
1 let numbers = [[1,3],[4,7]]
和一维数组一样,可以使用append()方法,往多维数组中添加更多的数组元素:
1 var numbers = [[1,7]] 2 numbers.append([8,10]) //numbers的元素:[[1,7],[8,10]]
那么如何获取多维数组中的元素呢?假如您需要获得numbers数组中的8这个数字,首先通过numbers[2]获得[8,10]数组,然后通过numbers[2][0]获得[8,10]数组中的第一个元素。
即通过numbers[2][0]获得第三个子数组中的第一个元素:8。
3.4.3 数组的遍历
在下面的代码中,使用..<符号,遍历数组从0至4之间的所有元素:
1 var numbers = [1,5] 2 for index in 0 ..<numbers.count 3 { 4 print(numbers[index]) 5 }
数组的遍历其实可以更加简单:
1 var numbers = [1,5] 2 for num in numbers 3 { 4 print(num) 5 }
如果仅需遍历指定范围内的数组元素,可以通过定义Range的方法来实现:
1 var numbers = [1,5] 2 let range = 2..<numbers.count 3 for (index,value) inzip(range,numbers[range]) 4 { 5 print("\(index): \(value)") 6 }
对于包含复杂元素的数组进行遍历,也是非常简单的事情:
1 let scores =["Jerry":78,"Thomas":88,"John":92] 2 for (student,score) in scores 3 { 4 print(student + "' score is\(score)") 5 }
通过for-in语句,也能很方便地实现对多维数组的遍历:
1 var numbers = [[1,7]] 2 for subNumbers in numbers 3 { 4 for number in subNumbers 5 { 6 print(number) 7 } 8 }
一个人写书,难免会有不足和纰漏,欢迎大家通过这个邮箱:coolketang@163.com
将你的意见和建议告诉我们,感谢!