Manipulación de Matrices y Subíndices en Programación

Clase 15 de 27Curso de Programación Orientada a Objetos en Swift

Resumen

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:).
struct 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) } }

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.

  • Validación: fila ≥ 0, columna ≥ 0, fila < rows, columna ≤ columns (según se plantea).
  • Conversión 2D→1D: index = row * columns + column.
  • Ejemplos: (0,0) → 0. (0,1) → 1. (1,0) → columns.
extension Matrix { func indexIsValid(row: Int, column: Int) -> Bool { return row >= 0 && column >= 0 && row < rows && column <= columns } }

¿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.

extension Matrix { 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.5 matrix[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 in 0..<matrix.rows { for c in 0..<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.