swift类_枚举下标定义

分享到:

类、结构体以及枚举均可以定义下标,该下标是访问集合、列表或序列成员元素的捷径。通过下标索引就可以方便地检索和设置相应的值,而不需要其他的额外操作。例如,你可以通过someArray[index]来访问数组中的元素,或者通过someDictionary[key]来对字典进行索引。

你可以为一个类型定义多个下标,以及适当的下标重载用来根据传递给下标的索引来设置相应的值。下标不仅可以定义为一维的,还可以根据需要定义为多维的输入参数。

 

下标语法

 

借助下标,你可以在实例名称之后通过在方括号内写入一个或多个数值的形式来查询某个类型的实例。其语法类似于实例方法语法和计算属性语法。与实例方法相类似,通过使用关键字subscript定义下标,并指定一个或多个输入参数以及一个返回类型值。与实体方法不同的是,下标仅为读写的或只读的。用与针对计算型属性相同的方式,该行为通过getter和setter语句联通:

 

subscript(index: Int) -> Int {

get {

// return an appropriate subscript value here

}

set(newValue) {

// perform a suitable setting action here

}

}

 

newValue的类型与下标的返回值相同。和计算型属性一样,你可以选择不指定setter(newValue)的参数。因为当未指定时,将默认参数newValue赋给setter。

和计算型属性一样,针对只读下标,可以不需要关键字get:

 

subscript(index: Int) -> Int {

// return an appropriate subscript value here

}

 

下面给出了一个只读下标执行的示例,定义了一个TimesTable结构来表示一个整数的n-times-table:

 

struct TimesTable {

let multiplier: Int

subscript(index: Int) -> Int {

return multiplier * index

}

}

let threeTimesTable = TimesTable(multiplier: 3)

println("six times three is \(threeTimesTable[6])")

// prints "six times three is 18"

 

在该示例中,实例TimesTabe被创建为three-times-table。这是通过结构体的初始化器为实例的multiplier参数传入的数值3设置的。

你可以通过调用其下标查询threeTimesTabe实例,如hreeTimesTablep[6]调用中所示。这要求第6次进入three-times-table,three-times-table则会返回数值18,或3*6.

注:n-times-table是根据特定的数学规则设置的。因此,不应该为three Times Table[some Index]元素设置一个新值,且TimesTable的下标被定义为只读下标。

 

下标的使用

 

“下标”的具体含义根据使用时的上下文来确定。下标主要用来作为集合、列表和序列的元素快捷方式。你可以自由的为你的类或结构定义你所需要的下标。

例如,Swift中的Dictonary类型使用一个下标来设置和检索存储在Dictonary实例中的值。你可以在下标括号内,通过提供关键字dictionary关在字典内设置一个值,且对该下标赋予一个字典值:

 

var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]

numberOfLegs["bird"] = 2

 

上面的例子中定义了一个变量numberOfLegs,然后通过键值对初始化。经推断,numberOfLegs dictionary的类型为Dictonary <String, Int>。在字典创建后,该示例使用下标赋值方法添加了一个类型为字符串的键“bird”和Int值2到字典中。

更过关于Dictonary字典下标的信息,详见Dictionary的存储和修改。

注:Swift中的Dictonary类型实现的键值对下标是可选类型。对于上述numberOfLegs字典而言,关键值下标采取和返回Int?型或“可选Int”的一个值。字典类型的这种使用可选类型下标的方式说明不是所有的键都有对应的值。同样也可以通过给键赋值nil来删除这个键。

 

下标选项

 

下标可以接收任意数量的参数,参数的类型也可以各异。下标还可以返回任何类型的值。下标可以使用变量参数和可变参数,但是不能使用输入、输出参数或者提供默认参数的值。

类或结构体可以根据其需要实现各种下标方式,可以在需要时使用合适的下标通过中括号中的参数返回需要的值。。这种多下标的定义被称作下标重载。

当然,最常见的下标用法是单个参数,也可以定义多个参数的下标。下列示例定义了一个Matrix结构体,它含有二维的Double值。Matrix结构的下标采用两个整型参数:

 

struct Matrix {

let rows: Int, columns: Int

var grid: Double[]

init(rows: Int, columns: Int) {

self.rows = rows

self.columns = columns

grid = Array(count: rows * columns, repeatedValue: 0.0)

}

func indexIsValidForRow(row: Int, column: Int) -> Bool {

return row >= 0 && row < rows && column >= 0 && column < columns

subscript(row: Int, column: Int) -> Double {

get {

assert(indexIsValidForRow(row, column: column), "Index out of range")

return grid[(row * columns) + column]

}

set {

assert(indexIsValidForRow(row, column: column), "Index out of range")

grid[(row * columns) + column] = newValue

}

 

Matrix提供一个初始化器,使用两个参数rows和columns,然后建立了一个数组来存储类型为Double的rows*columns值。矩阵的每个位置的初始值设定为0.0。通过传递数组长度和初始值0.0给数组初始化器完成上述操作。数组的初始化方法参照数组的创建和初始化。

你可以传递两个参数row和column来完成Matrix的初始化:

 

var matrix = Matrix(rows: 2, columns: 2)

 

上述初始化操作创建了一个两行两列的Matrix实例。该Matrix实例的grid数组看起来是平坦的,但是实际上是矩阵从左上到右下的一维存储形式:

 

// 示意图

grid = [0.0, 0.0, 0.0, 0.0]

 

      col0  col1

row0   [0.0,     0.0,

row1    0.0,  0.0]

 

矩阵中的值可以通过使用包含row和column以及逗号的下标来设置:

 

matrix[0, 1] = 1.5

matrix[1, 0] = 3.2

 

这两种语句调用下标setter对矩阵右上角(横着是0,竖着是1)和左下角(横着是1,竖着是0)的两个元素分别赋值1.5和3.2:

 

[0.0, 1.5,

 3.2, 0.0]

 

矩阵下标的getter和setter方法都包括了一个断言语句来检查下标row和column是否有效。对于该断言,通过Matrix中的indexIsValid方法来判断row或column是否在矩阵的范围内。

 

func indexIsValidForRow(row: Int, column: Int) -> Bool {

return row >= 0 && row < rows && column >= 0 && column < columns

}

 

当访问矩阵边界外的下标时,触发断言:

 

let someValue = matrix[2, 2]

// this triggers an assert, because [2, 2] is outside of the matrix bounds

 

昵    称:
验证码:

相关文档:

swift
IOS实例
ObjectiveC