` es 100 dividido entre 2.
Los subíndices pueden definirse en clases (Class), estructuras (structure) y enumeraciones (enumeration). Pueden considerarse un atajo para acceder a objetos, colecciones o secuencias, sin necesidad de llamar a métodos específicos de asignación y acceso de la instancia.
Por ejemplo, para acceder a un elemento de una instancia de Array (array) con un subíndice, se puede escribir `someArray[index]`, y para acceder a un elemento de una instancia de Dictionary (diccionario), se puede escribir `someDictionary[key]`.
Para el mismo objetivo se pueden definir múltiples subíndices, sobrecargándolos según el tipo de valor del índice, y el número de valores de índice puede ser múltiple.
Sintaxis y aplicaciones de los subíndices
Sintaxis
Los subíndices te permiten acceder y asignar valores a una instancia pasando uno o más valores de índice entre corchetes después de la instancia.
La sintaxis es similar a una mezcla de métodos de instancia y propiedades calculadas.
Al igual que al definir métodos de instancia, para definir un subíndice se usa la palabra clave `subscript`, declarando explícitamente los parámetros de entrada (uno o más) y el tipo de retorno.
A diferencia de los métodos de instancia, los subíndices pueden ser de lectura-escritura o de solo lectura. Esto se parece un poco a los getters y setters de las propiedades calculadas:
subscript(index: Int) -> Int {
get {
// 用于下标脚本值的声明
}
set(newValue) {
// 执行赋值操作
}
}
Ejemplo 1
import Cocoa
struct subexample {
let decrementer: Int
subscript(index: Int) -> Int {
return decrementer / index
}
}
let division = subexample(decrementer: 100)
print("100 除以 9 等于 \(division[9])")
print("100 除以 2 等于 \(division[2])")
print("100 除以 3 等于 \(division[3])")
print("100 除以 5 等于 \(division[5])")
print("100 除以 7 等于 \(division[7])")
El resultado de ejecutar el programa anterior es:
100 除以 9 等于 11 100 除以 2 等于 50 100 除以 3 等于 33 100 除以 5 等于 20 100 除以 7 等于 14
En el ejemplo anterior, se creó una instancia de operación de división a través de la estructura `subexample`. El valor 100 se pasa como parámetro al constructor de la estructura para inicializar el miembro de instancia `decrementer`.
Puedes obtener el resultado a través del subíndice, por ejemplo `division
Ejemplo 2
import Cocoa
class daysofaweek {
private var days = ["Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "saturday"]
subscript(index: Int) -> String {
get {
return days[index] // 声明下标脚本的值
}
set(newValue) {
self.days[index] = newValue // 执行赋值操作
}
}
}
var p = daysofaweek()
print(p[0])
print(p[1])
print(p[2])
print(p[3])
El resultado de ejecutar el programa anterior es:
Sunday Monday Tuesday Wednesday
Uso
Según el escenario de uso, los subíndices también tienen diferentes significados.
Normalmente, los subíndices son un atajo para acceder a elementos de colecciones, listas o secuencias.
Puedes implementar libremente subíndices en tus propias clases o estructuras para proporcionar la funcionalidad adecuada.
Por ejemplo, el diccionario (Dictionary) de Swift implementa el acceso y almacenamiento de valores en sus instancias mediante subíndices. Se usa un valor del mismo tipo que la clave del diccionario en el subíndice, y se asigna un valor del tipo del diccionario a ese subíndice para establecer el valor en el diccionario:
import Cocoa var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4] numberOfLegs["bird"] = 2 print(numberOfLegs)
El resultado de ejecutar el programa anterior es:
["ant": 6, "bird": 2, "cat": 4, "spider": 8]
El ejemplo anterior define una variable llamada `numberOfLegs` e inicializa una instancia de diccionario con tres pares clave-valor usando un literal de diccionario. El tipo de los valores almacenados en el diccionario `numberOfLegs` se infiere como `Dictionary`.
Opciones de subíndices
Los subíndices permiten cualquier número de índices de entrada, y no hay limitación en el tipo de cada parámetro.
El valor de retorno de un subíndice también puede ser de cualquier tipo.
Los subíndices pueden usar parámetros variables y parámetros variádicos.
Una clase o estructura puede proporcionar múltiples implementaciones de subíndices según sus necesidades, y al definir subíndices se distinguen por el tipo de parámetros entrantes. Al usar un subíndice, se emparejará automáticamente la implementación adecuada. Esto esla sobrecarga de subíndices.。
import Cocoa
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])")
El resultado de ejecutar el programa anterior es:
1.0 2.0 3.0 5.0
La estructura `Matrix` proporciona un inicializador con dos parámetros de entrada, `rows` y `columns`, que crea un array de tipo `Double` lo suficientemente grande como para contener `rows * columns` elementos. Para el almacenamiento, se establece el tamaño del array y se inicializa cada elemento con 0.0.
Puedes construir una nueva instancia de Matrix pasando las cantidades adecuadas de row y column.
Otras extensiones