下标脚本 可以定义在类(Class)、结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问对象、集合或序列的快捷方式,不需要再调用实例的特定的赋值和访问方法。
下标脚本对传入参数类型没有任何限制,参数的个数没有限制,返回值也没有任何限制,但是传入参数不能是in-out类型,也不可以设置默认值。某些情况下 在一个类或一个结构体中可以存在多个下标脚本,区分它们的主要方法就是传入的参数和返回值。
举例来说,用下标脚本访问一个数组(Array)实例中的元素可以这样写 someArray[index] ,访问字典(Dictionary)实例中的元素可以这样写 someDictionary[key]。
subscript(index: Int) -> Int { get { // 用于下标脚本值的声明 } set(newValue) { // 执行赋值操作 } }
struct Matrix { let rows: Int, columns: Int var print: [Double] init(rows: Int, columns: Int) { self.rows = rows self.columns = columns print = Array(repeating: 0.0, count: rows * columns) } subscript(row: Int, column: Int) -> Double { get { return print[(row * columns) + column] } set { print[(row * columns) + column] = newValue } } } // 创建了一个新的 3 行 3 列的Matrix实例 var mat = Matrix(rows: 3, columns: 3) // 通过下标脚本设置值 mat[0,0] = 1.0 mat[0,1] = 2.0 mat[1,0] = 3.0 mat[1,1] = 5.0 // 通过下标脚本获取值 print("\(mat[0,0])") print("\(mat[0,1])") print("\(mat[1,0])") print("\(mat[1,1])")
运行结果
1.0 2.0 3.0 5.0
参考 ―― [ 菜鸟教程]
extension String { subscript(start:Int, length:Int) -> String { get{ let index1 = self.index(self.startIndex, offsetBy: start) let index2 = self.index(index1, offsetBy: length) let range = Range(uncheckedBounds: (lower: index1, upper: index2)) return self.substring(with: range) } set{ let tmp = self var s = "" var e = "" for (idx, item) in tmp.characters.enumerated() { if(idx < start) { s += "\(item)" } if(idx >= start + length) { e += "\(item)" } } self = s + newValue + e } } subscript(index:Int) -> String { get{ return String(self[self.index(self.startIndex, offsetBy: index)]) } set{ let tmp = self self = "" for (idx, item) in tmp.characters.enumerated() { if idx == index { self += "\(newValue)" }else{ self += "\(item)" } } } } } var str = "hangge.com" print(str[7,3]) print(str[7]) str[7,3] = "COM" str[0] = "H" print(str[0,10])
运行结果
com c Hangge.COM
class Matrix { let rows: Int, columns: Int var grid: [Double] init(rows: Int, columns: Int) { self.rows = rows self.columns = columns grid = Array(repeating: 0.0, count: rows * columns) } 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: row, column: column), "Index out of range") return grid[(row * columns) + column] } set { assert(indexIsValidForRow(row: row, column: column), "Index out of range") grid[(row * columns) + column] = newValue } } } let value = Matrix(rows: 20,columns: 20) value[10,10] = 20 print(value[10,10])
参考 ―― [链接]
转载请标明出处:Swift 下标脚本
文章来源: Swift 下标脚本