` 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`.Una vez creada la instancia del diccionario, se asigna el valor entero 2 a la posición del índice `bird` mediante el subíndice.


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