Aprende a implementar una matriz con subíndice doble en Swift para leer y escribir valores como fila y columna, usando un array 1D por debajo. Con una estructura clara, validación de índices con assert y un mapeo matemático simple, tendrás un acceso 2D eficiente y seguro. Ideal para practicar getter, setter, subscript, print y terminator.
¿Cómo se define una matriz con subíndice doble en Swift?
Una matriz queda definida por su número de filas y columnas y un contenedor mutable para los datos. Las dimensiones son fijas, mientras que el contenido puede cambiar.
Filas y columnas inmutables: se declaran con let.
Contenido mutable: se guarda en una variable grid como array de Double.
Inicialización: se llena con ceros usando Array(repeating:count:).
Ejemplo de creación y estado inicial en 2x2: cuatro ceros organizados lógicamente en 2 filas y 2 columnas, aunque internamente sea un único array largo.
¿Qué inicializa el init y el array grid?
Repite el valor 0.0 tantas veces como filas por columnas.
Obtienes una colección “larga” que luego reinterpretas en 2D mediante el subíndice.
¿Por qué las dimensiones son inmutables y el contenido mutable?
Las dimensiones definen la estructura: no deben cambiar después.
El contenido sí puede variar al asignar con el subíndice.
¿Cómo validar índices y convertir coordenadas 2D a posición 1D?
Antes de acceder, se valida que la fila y la columna estén en rango. Esto evita accesos negativos o fuera de tamaño. Luego, se mapea la posición 2D al índice del array 1D.
¿Cómo funciona la ecuación row * columns + column?
Multiplica la fila por el ancho total y suma la columna.
Transforma coordenadas 2D en una posición lineal del grid.
¿Qué errores evita la validación previa?
Filas o columnas negativas.
Posiciones que excedan los límites.
¿Cómo leer, escribir y recorrer la matriz con subíndice doble?
El subíndice doble permite usar la sintaxis matrix[fila, columna]. Se usa assert con el mensaje “index out of range” para verificar la precondición en desarrollo. El getter devuelve el valor y el setter lo asigna en el índice lineal.
extensionMatrix{subscript(row:Int, column:Int)->Double{get{assert(indexIsValid(row: row, column: column),"index out of range")return grid[row * columns + column]}set{assert(indexIsValid(row: row, column: column),"index out of range") grid[row * columns + column]= newValue
}}}
Ejemplo de uso en 2x2: asignaciones y lectura visibles.
var matrix =Matrix(rows:2, columns:2)matrix[0,1]=1.5matrix[1,0]=2.5
Para imprimir en formato matricial, se recorre con for anidados. Se usa print sin separador y con terminator como espacio para evitar saltos de línea en cada elemento. Al final de cada fila, se hace un print vacío.
for r in0..<matrix.rows {for c in0..<matrix.columns {print(matrix[r, c], terminator:" ")}print()}
¿Qué habilidades y palabras clave practicas aquí?
Subíndice doble con subscript para acceso 2D intuitivo.
Getter y setter con uso de newValue.
Validación con assert y mensaje "index out of range".
Mapeo 2D→1D con row * columns + column.
Recorrido con for y formateo con print y terminator.
¿Te animas a extenderla con suma, resta, producto o incluso la matriz inversa cuando te sientas preparado? Comparte tus avances y dudas en los comentarios.