Historia del tema:
El subíndice fue introducido en Swift para permitir el manejo conveniente y seguro de colecciones y estructuras de datos, permitiendo acceder a los elementos con una sintaxis familiar de corchetes.
Problema:
Confusión entre subíndice, métodos y propiedades computadas, su ámbito de aplicación y el uso incorrecto del subíndice para acceder a datos que no son colecciones o que tienen efectos secundarios.
Solución:
El subíndice es un mecanismo especial que permite proporcionar acceso a los elementos de un objeto mediante corchetes. Puede ser de solo lectura o de lectura-escritura y soporta parámetros de cualquier tipo: no solo Int, sino también String o sus propios tipos.
Ejemplo de código:
struct Matrix { private var data: [[Int]] init(rows: Int, columns: Int) { data = Array(repeating: Array(repeating: 0, count: columns), count: rows) } subscript(row: Int, column: Int) -> Int { get { data[row][column] } set { data[row][column] = newValue } } } var matrix = Matrix(rows: 2, columns: 2) matrix[0, 1] = 5 print(matrix[0, 1]) // 5
Características clave:
¿Puede el subíndice tener más de un parámetro?
Sí, el subíndice puede aceptar cualquier conjunto de parámetros y de cualquier tipo (por ejemplo, tupla).
Ejemplo de código:
// Ver el ejemplo anterior con Matrix, donde subscript(row: Int, column: Int)
¿Se puede implementar un subíndice solo de lectura?
Sí, si no se declara el set, el subíndice será solo de lectura.
Ejemplo de código:
struct ReadOnlyArray { private let items = [1, 2, 3] subscript(index: Int) -> Int { return items[index] } }
¿Cuál es la diferencia entre el subíndice y la propiedad computada?
La propiedad computada siempre tiene un nombre fijo y no acepta parámetros. El subíndice permite el acceso mediante un índice variable, simulando una estructura coleccionable.
En una estructura personalizada, el subíndice se utiliza para cambiar el estado global, lo que provoca efectos secundarios inesperados al acceder simplemente a un elemento en la matriz.
Pros:
Contras:
Se utiliza el subíndice solo para trabajar con una matriz privada dentro de la estructura, implementando el manejo de salida de límites con un retorno de nil.
Pros:
Contras: