文章目录

Objective-C里面,我们可以使用someArray[index]someDictionary[@"index"]ArrayDictionary的元素进行访问, 分别代替myArray.objectAtIndex(2)[someDictionary objectForKey:@"index"]。在Swift中,可以在类,结构体和枚举中使用subscripts来自定义下标。Swift中自定义下标的语法要求比较宽广,有以下一些特性:

  • 下标脚本的重载:可以同时定义多个subscripts,只要下标参数和返回值不一样即可
  • 下标脚本传入参数不支持in-out修饰和默认的参数值,支持外部参数名称
  • 类,结构体和枚举都支持下标脚本定义
  • 与计算属性的定义相同,使用getter和setter,同时支持定义只读下标脚本
  • 下标参数与普通方法参数默认定义情况有所区别,所有下标参数如果没有显式定义外部参数名称,Swift不会给下标参数默认加上外部参数名称。而实例中的方法是从第二个参数开始,会默认加上外部参数名称
  • 下标脚本允许返回Optional值

Swiftsubscripts定义如下面的格式:

1
2
3
4
5
6
7
8
9
10
11
subscript(parameters) -> ReturnType
{
get
{
//return someValue
}
set (newValue)
{
//setSomeValue()
}
}

只读的subscripts可以使用如下格式定义,类似于只读计算属性:

1
2
3
4
subscript(parameters) -> ReturnType
{
return someValue
}

第一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct TimesTable
{
let multiplier: Int
subscript(index: Int) -> Int
{
return multiplier * index
}
subscript(index: Double, mult: Int) -> Int
{
return multiplier * Int(index) * mult
}
}
let threeTimesTable = TimesTable(multiplier: 3)
threeTimesTable[3] //返回9
threeTimesTable[4.0, 4] //返回48

此例中,定义了2个只读下标脚本。第一个下标脚本一个传入参数,第二个下标脚本二个传入参数。调用时候,默认都不需要显式写入外部参数名称,这跟类方法的默认行为不一样。

第二个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
struct Matrix
{
let rows: Int
let 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
}
}
}
var matrix = Matrix(rows: 4, columns: 4)
matrix[0, column: 0] = 1
matrix[1, column: 1] = 1
matrix[2, column: 2] = 1
matrix[3, column: 3] = 1
matrix[4, column: 4] = 1 //Index out of range

此例中,定义了一个可读写的subscript,并且需要传入2个参数,第二个参数需要提供外部参数名称(实际上不需要)。并且越界的情况下,会通过断言来返回错误。

参考资料:

文章目录