标签:
1、下标(Subscript)
类、结构体和枚举都可以定义下标,这是一种访问集合类型、列表或者队列的成员元素的简写方式。你可以用下标来设置和取出对应的值,而不必为写入和读取设置单独的方法。例如,访问Array实例用someArray[index],访问Dictionary实例用someDictionary[key]。
可以为同一个类型定义多种下标,选择哪一种下标形式则取决于你要传递给下标的索引值的类型。下标的维度不限定为一维,你可以根据自己的需要给下标设置多个输入参数。
2、下标语法
下标可以允许你在实例名字后面的[]中写上一个或多个值来对这个实例进行query。下标的语法与实例方法和计算属性的语法类似。和实例方法一样,下标有传入参数和返回类型。不同于实例方法的是,下标可以可读可写或者只读的。和计算属性一样,下标有get和set:
1 subscript(index: Int) -> Int { 2 get { 3 // return an appropriate subscript value here 4 } 5 set(newValue) { 6 // perform a suitable setting action here 7 } 8 }
newValue的类型和subscript的返回类型相同。和计算属性一样,如果你不指定新值的参数名,则默认使用newValue。
只读下标:
1 subscript(index: Int) -> Int { 2 // return an appropriate subscript value here 3 }
下面是一个只读下标的例子:
1 struct TimesTable { 2 let multiplier: Int 3 subscript(index: Int) -> Int { 4 return multiplier * index 5 } 6 } 7 let threeTimesTable = TimesTable(multiplier: 3) 8 print("six times three is \(threeTimesTable[6])") 9 // prints "six times three is 18"
3、下标的使用规则
subscript的实际意义取决于它所处的环境。通常,subscript用于方便访问集合、列表、队列的成员。你可以根据自己的需求来定义subscript的实现。
例如,Dictionary的下标:
1 var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4] 2 numberOfLegs["bird"] = 2
注意:Dictionary的下标返回的是Int?类型,因为并非每一个key都能对应一个value,如果输入的key不存在,则返回nil。
(1)subscript的可选项
subscript可以接收任意数量的参数,这些参数可以是任何类型。
subscript也可以返回一种类型的值。
subscript可以接收变量参数和不定参数,但是不能接收in-out参数,也不能有参数默认值。
类和结构体可以定义多种subscript的实现,使用哪一种实现则取决于[]中传入的参数类型。多种subscript的实现,也称为subscript重载。
尽管最常见的是一个参数的subscript,你可以根据需要定义多个参数。
1 struct Matrix { 2 let rows: Int, columns: Int 3 var grid: [Double] 4 init(rows: Int, columns: Int) { 5 self.rows = rows 6 self.columns = columns 7 grid = Array(count: rows * columns, repeatedValue: 0.0) 8 } 9 func indexIsValidForRow(row: Int, column: Int) -> Bool { 10 return row >= 0 && row < rows && column >= 0 && column < columns 11 } 12 subscript(row: Int, column: Int) -> Double { 13 get { 14 assert(indexIsValidForRow(row, column: column), "Index out of range") 15 return grid[(row * columns) + column] 16 } 17 set { 18 assert(indexIsValidForRow(row, column: column), "Index out of range") 19 grid[(row * columns) + column] = newValue 20 } 21 } 22 }
上面是 一个矩阵的结构体。用下标的方式来访问和修改数组的值。
在subscript的get和set中都用了断言来检查下标是否有效,其中,用了一个indexIsValidForRow(_:column:)方法:
1 func indexIsValidForRow(row: Int, column: Int) -> Bool { 2 return row >= 0 && row < rows && column >= 0 && column < columns 3 }
如果下标超出了矩阵的范围,就会产生一个assertion:
1 let someValue = matrix[2, 2] 2 // this triggers an assert, because [2, 2] is outside of the matrix bounds
标签:
原文地址:http://www.cnblogs.com/tt2015-sz/p/4871145.html