Swift学习:2.12 下标脚本
参考Swift 官方教程《The Swift Programming Language》中文版
下标脚本(Subscripts)下标脚本可以定义在类(Class)、结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问对象、集合或序列的快捷方式,不需要再调用实例的特定的赋值和访问方法。举例来说,用下标脚本访问一个数组(Array)实例中的元素可以这样写 对于同一个目标可以定义多个下标脚本,通过索引值类型的不同来进行重载,而且索引值的个数可以是多个。
下标脚本语法下标脚本允许你通过在实例后面的方括号中传入一个或者多个的索引值来对实例进行访问和赋值。语法类似于实例方法和计算型属性的混合。与定义实例方法类似,定义下标脚本使用 subscript(index: Int) -> Int {
get {
// 返回与入参匹配的Int类型的值
}
set(newValue) {
// 执行赋值操作
}
}
与只读计算型属性一样,可以直接将原本应该写在 subscript(index: Int) -> Int {
// 返回与入参匹配的Int类型的值
}
下面代码演示了一个在 struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
println("3的6倍是(threeTimesTable[6])")
// 输出 "3的6倍是18"
在上例中,通过 你可以通过下标脚本来得到结果,比如
下标脚本用法根据使用场景不同下标脚本也具有不同的含义。通常下标脚本是用来访问集合(collection),列表(list)或序列(sequence)中元素的快捷方式。你可以在你自己特定的类或结构体中自由的实现下标脚本来提供合适的功能。 例如,Swift 的字典(Dictionary)实现了通过下标脚本来对其实例中存放的值进行存取操作。在下标脚本中使用和字典索引相同类型的值,并且把一个字典值类型的值赋值给这个下标脚本来为字典设值: var numberOfLegs = ["spider": 8,"ant": 6,"cat": 4]
numberOfLegs["bird"] = 2
上例定义一个名为 更多关于字典(Dictionary)下标脚本的信息请参考读取和修改字典
下标脚本选项下标脚本允许任意数量的入参索引,并且每个入参类型也没有限制。下标脚本的返回值也可以是任何类型。下标脚本可以使用变量参数和可变参数,但使用写入读出(in-out)参数或给参数设置默认值都是不允许的。 一个类或结构体可以根据自身需要提供多个下标脚本实现,在定义下标脚本时通过入参个类型进行区分,使用下标脚本时会自动匹配合适的下标脚本实现运行,这就是下标脚本的重载。 一个下标脚本入参是最常见的情况,但只要有合适的场景也可以定义多个下标脚本入参。如下例定义了一个 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,"Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
你可以通过传入合适的 var matrix = Matrix(rows: 2,columns: 2)
上例中创建了一个新的两行两列的 // 示意图
grid = [0.0,0.0,0.0]
col0 col1
row0 [0.0,row1 0.0,0.0]
将值赋给带有 matrix[0,1] = 1.5
matrix[1,0] = 3.2
上面两条语句分别 [0.0,1.5,3.2,0.0]
func indexIsValidForRow(row: Int,column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
断言在下标脚本越界时触发: let someValue = matrix[2,2]
// 断言将会触发,因为 [2,2] 已经超过了matrix的最大长度 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |