下标
swift允许我们为 类,结构体,枚举 定义下标,以更便捷的方式访问一大堆属性。比如Array和Dictionary都是结构体,swift的工程师已经为这两个类型提供好了下标操作的代码,所以,我们才可以通过 myArray[2]这种方式,读取和改写这个struct中保存的数据。而且,一个类型中可以定义多种下标访问方式(重载,关于重载,在后面的笔记中会提到,这里先不用太在意)
下标可以定义为“读写”型的,也可以定义为”只读”型,这种行为,是通过定义一组操作完成的,这与之前笔记中提到过的用于计算的属性的setter和getter是一样的:
下标定义形式:
“读写”型:
subscript(index: Int) -> Int {
get {
}
set(newValue) {
}
}
“只读”型:
subscript(index: Int) -> Int {
//前面的笔记中有提到,因为只有一个get方法,是可以省掉get{ 与 }的。
}
官方的例子:
定义了一个叫 TimesTable的结构体,它有一个“只读”型下标的定义,通过下标语法,可以取得到multiplier那么多倍的index值。。。因为那是 multiplier * index嘛。。。。
所以,最后一个println的结果是18.(multiplier的值被初始化为3, 3*6 = 18)
下标可以使用任何类型做为输入参数,也就是说,我们可以把class, struct, enum, Int, Double, String 等等,当做下标的参数使用,但是这个参数不能是in-out类型的,也不能有默认值。
前面的笔记中没有提到过任何关于“多维数组”的词,也没有相关的例子,因为我也不知道怎么弄,囧。
但是有了自定义下标的话,就不一样了,事情就变得简单了,一切由我们自己说了算,不管是二维,三维,四维,任何维度上保存什么类型等等,一切都由我们自己说了算, 拿二维数组来举例(其实是官方的例子):
定义了一个矩阵类型 Matrix, 通过var grid: Double[] 的使用可以看到, 第7行,定义了一个一维的Array来保存所有的数据。 第12行开始定义了下标的访问行为, 可以get, 也可以set, 所以这个下标是个“读写”型的。
根据下标的参数 row和 column可以计算出我们要访问的元素的在Array中的位置,通过Array的下标可以直接读取或者写入我们的数据。
var myMatrix = Matrix(row: 2, columns: 2)
myMatrix[0, 0] = 8
println(myMatrix[0, 0]) //得到8
至此,我们就可以开始快乐的使用二维数组了~~~多维的也一样