Manipulación de Matrices y Subíndices en Programación
Clase 15 de 27 • Curso de Programación Orientada a Objetos en Swift
Contenido del curso
Tipos de Propiedades
- 5

Propiedades Almacenadas en Swift: Uso y Ejemplos Prácticos
04:48 min - 6

Propiedades Lazy en Programación: Uso y Ventajas
07:16 min - 7

Propiedades Computadas en Swift: Uso y Ejemplos Prácticos
10:30 min - 8

Computed properties de solo lectura en Swift
05:14 min - 9

Observers en Swift: willSet y didSet
07:18 min - 10

Variables estáticas en clases, estructuras y enumerados
09:19 min
Métodos, subíndices y herencia
- 11

Métodos de instancia en Swift con self
07:35 min - 12

Métodos Mutantes en Estructuras y Enumerados en Swift
09:05 min - 13

Métodos de clase en Swift: static vs class
10:50 min - 14

Subíndices en Swift: Sintaxis y Aplicaciones Prácticas
09:01 min - 15

Manipulación de Matrices y Subíndices en Programación
Viendo ahora - 16

Herencia de Clases en Programación Orientada a Objetos
10:14 min - 17

Sobrescritura de Métodos y Propiedades en Clases Derivadas
12:11 min
Inicializadores o constructores
- 18

Inicializadores en Sweet: Creación y Uso Efectivo de Constructores
06:50 min - 19

Modificación de Constructores y Parámetros Opcionales en Swift
10:10 min - 20

Constructores Designados y de Conveniencia en Herencia de Clases
09:37 min - 21

Constructores y manejo de inicialización opcional en Swift
08:42 min - 22

Destructores en Programación: Liberación de Recursos Automática
07:12 min
Encadenamiento opcional
Conclusión
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.