Swift 中的下标是什么?如何自定义下标?下标可以接受多个参数吗?
Swift 中的下标是一种快捷方式,用于访问集合、列表或序列中元素的成员。通过下标,你可以使用方括号语法 [] 来访问和设置值,而不需要调用单独的方法。
基本下标语法:
swiftstruct TimesTable { let multiplier: Int subscript(index: Int) -> Int { return multiplier * index } } let threeTimesTable = TimesTable(multiplier: 3) print(threeTimesTable[6]) // 18
下标的特点:
- 使用
subscript关键字定义 - 可以接受一个或多个参数
- 可以是读写、只读或只写
- 可以有可变参数
- 可以有默认参数值
- 可以抛出错误
只读下标:
swiftstruct Matrix { let rows: Int let columns: Int var grid: [Double] init(rows: Int, columns: Int) { self.rows = rows self.columns = columns self.grid = Array(repeating: 0.0, count: rows * columns) } subscript(row: Int, column: Int) -> Double { get { return grid[(row * columns) + column] } } }
读写下标:
swiftstruct Matrix { let rows: Int let columns: Int var grid: [Double] subscript(row: Int, column: Int) -> Double { get { return grid[(row * columns) + column] } set { grid[(row * columns) + column] = newValue } } } var matrix = Matrix(rows: 2, columns: 2) matrix[0, 0] = 1.0 matrix[0, 1] = 2.0 print(matrix[0, 0]) // 1.0
接受多个参数的下标:
swiftstruct Chessboard { var board: [[String]] = Array(repeating: Array(repeating: "", count: 8), count: 8) subscript(row: Int, column: Int) -> String { get { return board[row][column] } set { board[row][column] = newValue } } subscript(position: String) -> String { get { let column = position[position.startIndex] let row = Int(position.dropFirst())! return board[row][columnToIndex(column)] } set { let column = position[position.startIndex] let row = Int(position.dropFirst())! board[row][columnToIndex(column)] = newValue } } private func columnToIndex(_ column: Character) -> Int { return Int(column.asciiValue! - Character("a").asciiValue!) } } var chessboard = Chessboard() chessboard["a1"] = "Rook" chessboard[0, 0] = "Queen"
类型下标:
swiftenum Planet: Int { case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune static subscript(n: Int) -> Planet? { return Planet(rawValue: n) } } let mars = Planet[4]
带默认参数的下标:
swiftstruct DefaultSubscript { var values: [Int] = [] subscript(index: Int, default defaultValue: Int = 0) -> Int { get { return index < values.count ? values[index] : defaultValue } set { if index < values.count { values[index] = newValue } else { values.append(newValue) } } } }
最佳实践:
- 使用下标提供简洁的访问语法
- 合理设计下标参数,提高可读性
- 为多维数据提供多参数下标
- 注意下标的性能影响
- 在复杂场景考虑使用方法替代下标