ProgramaciónDesarrollador iOS/Swift

Explique cómo funciona el subíndice en Swift, cuáles son las reglas para su declaración y llamada, y en qué se diferencia de los métodos normales o propiedades computadas?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • Permite sobrecargar el subíndice según sea necesario, incluyendo la posibilidad de tener múltiples con diferentes parámetros.
  • A diferencia de los métodos, el subíndice siempre se llama a través de corchetes.
  • Puede devolver valores de cualquier tipo, soporta tanto lectura como escritura.

Preguntas trampa.

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

Errores comunes y antipatrón

  • Uso del subíndice para operaciones con efectos secundarios (por ejemplo, modificar variables globales).
  • Manejo implícito fuera de los límites del índice (crash en lugar de comportamiento seguro).
  • Confundir subíndice y métodos sin razón aparente.

Ejemplo de la vida real

Caso negativo

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:

  • Brevedad

Contras:

  • Efectos secundarios no obvios
  • Difícil de depurar

Caso positivo

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:

  • Lógico y seguro
  • Fácil de depurar
  • Código fácil de leer

Contras:

  • Necesidad de agregar un manejo de errores explícito si es necesario