Swift 下标脚本

匿名 (未验证) 提交于 2019-12-03 00:19:01

下标脚本 可以定义在类(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 下标脚本
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!