1、集合类型
Swift中的集合类型主要是指Array、Dictionary和Set,详细情况参见《Swift中常用的数据结构(上)》。Array中的元素是有序的,可以重复出现;Set里面的元素是无序的,不能重复出现。另外,Dictionary中的键(Key)和值(Value)也是无序的,并且键(Key)是不能重复的,但是值(Value)却可以重复出现。
声明数组和字典时,既可以使用泛型语法(也称标准语法),又可以使用简写语法。但是,声明Set只能用泛型语法。不过,Set可以借助数组的简写语法来进行快速声明。
2、值类型参数的引用传递
函数参数的传递有两种:值类型和引用类型。值类型传递的是参数的一个副本,它在函数调用的过程中不会影响原始数据;引用类型是把数据本身(也就是内存地址)传递过去,它在函数调用的过程中可以影响原始数据。
在Swift中,除了类之外,常见的原生数据类型都是值类型。在实际开发过程中,有时候需要将值类型参数作为引用的方式进行传递。Swift中提供了一个关键字inout专门用来处理这种情况。使用inout修饰的参数被称为输入输出参数。函数在调用时,参数前面要加上取地址符&。inout和取地址符是相互对应的。以我在《算法基础知识导引》中讲解的插入排序为例:
// 插入排序的代码实现
func insertionSort(alist : inout [Int]) {
// 遍历数组中下标从1到alist.count - 1的元素
for i in 1..<alist.count {
// 将遍历出来的元素存储到临时变量tmp中
let tmp = alist[i]
// 给已经排好序的元素下标赋值
var j = i - 1
// 下标j有意义,并且元素alist[j]的值比元素tmp大时
while j >= 0 && alist[j] > tmp {
// 将元素alist[j]的值赋值给下标为i(也就是下标为j + 1)的元素
alist[j + 1] = alist[j]
// 将下标j的值减1
j = j - 1
}
// 将tmp赋值给原来下标值为j(也就是现在下标值为j + 1)的元素
alist[j + 1] = tmp
}
}
// 声明一个未经排序的数组
var myIntArr : [Int] = [56, 17, 63, 34, 77, 52, 68]
// 利用插入排序对原来的数组进行重新排序
insertionSort(alist: &myIntArr)
在上述代码中,函数insertSort()的参数是用inout修饰的,所以在函数调用的时候,它传递的是数组的引用地址,并且经过排序之后,原始数组中的值也发生了变化。
网友评论