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.