
Las colecciones avanzadas de Swift pueden ayudarlo a modelar objetos más complejos en sus aplicaciones y crear una API que sea más fácil de entender y usar. En esta publicación, modelo un tablero de ajedrez usando los subíndices de Swift y también cubro tuplas y matrices multidimensionales.
Índice de contenido
¿Qué son las tuplas y por qué debería usarlas?
Las tuplas de Swift (pronunciadas como “herramientas” o “tuplas”) proporcionan una forma de crear un grupo de valores relacionados. A diferencia de las matrices y los diccionarios, una tupla puede contener valores de diferentes tipos. Las tuplas son particularmente útiles para devolver múltiples valores de un método.
Echemos un vistazo a un ejemplo que demuestra cómo se pueden usar las tuplas en sus aplicaciones. Puede descargar el proyecto de muestra desde este enlace.
- Abre el TuplasDemo proyecto de muestra en Xcode.
- Ejecutemos el proyecto para obtener una descripción general de lo que hace la aplicación. Haga clic en Xcode Correr , y cuando la aplicación aparezca en el Simulador, debería aparecer la escena en Figura 1.
![]() |
| Figura 1 – El TuplasDemo escena principal |
Esta es una aplicación muy simple que le permite agregar nuevas ubicaciones a la base de datos de la aplicación utilizando Core Data.
- Sin ingresar un nombre de ubicación, haga clic en el Agregar Direccion botón. Debería ver una alerta que dice que debe ingresar un nombre de ubicación (Figura 2).
![]() |
| Figura 2 – El TuplasDemo alerta de campos obligatorios |
Hacer clic OK para cerrar la alerta. Ahora ingrese un Nombre del lugar (por ejemplo, Los Ángeles, París, Pekín) y haga clic en Agregar Direccion otra vez. Debería ver la alerta mostrada en figura 3 indicando que la ubicación se guardó correctamente en la base de datos.
![]() |
| Figura 3 – ¡La ubicación se guardó correctamente! |
- Regrese a Xcode y haga clic en el Detener botón. Veamos el código que usa tuplas para que todo esto suceda.
- Ampliar la Capa empresarial grupo y seleccione el mmBusinessObject.swift archivo en el Navegador de proyectos. Cerca de la parte superior del archivo, consulte el saveEntity declaración de método:

- Observe de cerca el valor de retorno. Esta declaración le dice que el saveEntity El método devuelve una tupla que contiene dos valores devueltos con nombre. El primero se llama Expresar y su tipo es Guardar Estado. El segundo se llama mensaje y su tipo es ¿Cuerda?.
Guardar Estado es una enumeración declarada en la parte superior de la mmBusinessObject.swift archivo de código:

los Guardar Estado enumeratiom contiene tres valores posibles que reflejan tres posibles resultados de guardar la entidad en la base de datos:
- Error – Ocurrió un error.
- Reglas rotas – se rompió una regla comercial (generalmente, un campo obligatorio se deja vacío).
- SaveComplete – La entidad se guardó correctamente.
Nosotros pudo solo devuelve el Guardar Estado valor de este método, pero podemos crear una mejor interfaz para el mmBusinessObject class devolviendo también un mensaje que contiene una explicación más detallada de lo que sucedió. ¡Ahí es donde las tuplas vienen al rescate!
- Observe que hay dos variables en la parte superior de la saveEntity método. los guardar Estado variable almacena el resultado de la saveEntity operación, y el saveMessage La variable contiene cualquier mensaje que queramos devolver de este método.

El código debajo de las variables es un poco complejo, pero por ahora solo necesita saber que estas dos variables se configuran según el resultado de la operación de guardado.
- Ahora mira el regreso declaración en la parte inferior del método:

Para crear un valor de retorno de tupla con nombre, especifique el nombre, dos puntos y el valor. Separe los valores con una coma y coloque los valores devueltos entre paréntesis.
Tenga en cuenta que puede nombrar los valores en una tupla Swift. Esto los hace mucho más útiles que en otros idiomas donde no puede hacer esto. No es necesario que nombre los valores de tupla, pero nombrarlos hace que su código sea mucho más legible e intuitivo.
- Veamos cómo se manejan los valores de retorno de la tupla. Hacer clic ViewController.swift en el Navegador de proyectos. Consulte la tercera línea de código en el agregar Direccion método:

Observe que el tipo de la variable de resultado es el mismo que el tipo devuelto por saveEntity método. ¡Es una tupla! Dado que cada valor de tupla tiene un nombre, el propósito de cada valor es muy claro.
Incluí el tipo de la variable de resultado para que puedas entender más claramente el código. Sin embargo, puede eliminar la declaración de tipo y Swift lo resolverá mediante la inferencia de tipo.
El resto del código usa una declaración de cambio para realizar acciones y mostrar mensajes basados en los valores de la tupla.
Aquí hay algunas reglas básicas para las tuplas:
- Los valores contenidos en una tupla pueden ser de cualquier tipo.
- Cualquier número de valores puede estar en una tupla, aunque más de dos o tres se vuelven engorrosos.
- Puede descomponer los valores contenidos en una tupla en variables individuales o constantes:

- Si solo necesita uno de los valores de la tupla, puede usar un guión bajo para ignorar los otros valores:

- También puede acceder a los valores de una tupla mediante un índice numérico:

- Es mejor nombrar los valores en la tupla y luego acceder a los valores usando esos nombres:

Matrices multidimensionales
Puede crear matrices con más de una dimensión. En Swift, crea efectivamente una “matriz de matrices” donde cada miembro de una matriz contiene una referencia a otra matriz. Por ejemplo, en Figura 4, cada elemento de la matriz de la izquierda hace referencia a una segunda matriz de la derecha que contiene tres elementos.
![]() |
| Figura 4 – Una matriz bidimensional |
Declara una matriz multidimensional anidando pares de corchetes. Por ejemplo, este código declara una matriz de enteros bidimensionales:

Inicializa una matriz multidimensional vacía como esta:

La matriz de cadenas bidimensionales de la Figura 4 se dimensiona e inicializa así:

Puede hacer referencia a elementos en una matriz multidimensional mediante dos conjuntos de corchetes. El primer conjunto de corchetes hace referencia a la matriz externa y el segundo establece la matriz interna. Por ejemplo, dada la matriz en la Figura 4:

En la siguiente sección, verá una aplicación práctica de dónde puede usar matrices multidimensionales en sus aplicaciones de iOS.
Crear colecciones personalizadas
Las clases de colección de Swift satisfacen la mayoría de las necesidades de sus aplicaciones de iOS. Sin embargo, en casos especiales, es posible que desee declarar sus propias clases de colección. Esto requiere el uso de subíndices de Swift.
Veamos cómo podemos usar subíndices para crear un Tablero de ajedrez clase que nos permite acceder a casillas individuales del tablero.
Figura 5 muestra un tablero de ajedrez con notación algebraica ligeramente modificada, una notación común que se usa para registrar una partida de ajedrez.
![]() |
| Figura 5 – Un tablero de ajedrez con notación algebraica |
Las filas del tablero están numeradas 1 a través de 8y las columnas a a través de h. Cada pieza de ajedrez tiene una designación de dos caracteres. Las piezas negras comienzan con la letra B y blanco con la letra W. La segunda letra especifica el tipo de piezas: R= Torre, norte= Noche, B= Obispo, Q= Reina, K= Rey, PAG= Peón. (Aquí es donde mi notación se desvía: en notación algebraica estándar, la ausencia de una letra indica un peón).
Para hacer referencia a un cuadrado específico en el tablero de ajedrez, usa una notación de 2 caracteres compuesta por columna / fila. Por ejemplo, el cuadrado en la esquina inferior izquierda del tablero es a1. El cuadrado de la esquina superior derecha es h8.
Para modelar esta notación de columna / fila, podemos crear un subíndice personalizado para un Tablero de ajedrez class y utilícelo en combinación con una matriz de cadenas bidimensional. Esto nos permite hacer referencia a un cuadrado como este:

Sintaxis de subíndice
Aquí está la sintaxis para declarar un subíndice en Swift:

Esta sintaxis es similar a las propiedades calculadas. Comienzas la declaración con el subíndice palabra clave, seguida de uno o más parámetros de entrada que aceptan los valores utilizados para recuperar un elemento específico de la colección. A continuación, especifica el tipo de retorno, que es el tipo de valor devuelto de la colección.
los obtener El método se ejecuta al recuperar un valor de la colección, y el conjunto El método se ejecuta al almacenar un elemento en la colección. Puede crear una colección de solo lectura omitiendo el conjunto método.
La muestra del tablero de ajedrez
Echemos un vistazo al código de muestra que muestra dos subíndices en acción. Puede descargar el patio de juegos de código de muestra en este enlace.
Abre el Subscripts.playground archivo en Xcode. En la parte superior del patio de recreo, un Tablero de ajedrez se declara la clase. Esta clase tiene una matriz de cadenas bidimensional llamada tablero que modela los cuadrados en un tablero de ajedrez. Contiene una matriz de ocho elementos, que representan las filas de un tablero de ajedrez. Cada elemento de fila contiene otra matriz de ocho elementos que representan las columnas de un tablero de ajedrez:

los tablero La matriz se inicializa con piezas de ajedrez ubicadas en cuadrados como al comienzo de una partida (Figura 5).
los Tablero de ajedrez La clase también tiene dos diccionarios:

los filas El diccionario acepta una letra de fila y devuelve el número de fila correspondiente. los columnas El diccionario acepta una cadena de columna y devuelve el número de columna correspondiente. Nosotros pudo deshacerse del columnas matriz y simplemente realice un cálculo matemático simple para determinar el número de columna. Pero, en aras de la capacidad de descubrimiento, elegí usar una metodología similar tanto para filas como para columnas (eligiendo claridad sobre inteligencia).
A continuación, en el patio de recreo, está la primera declaración de subíndice:

Este subíndice acepta un Cuerda parámetro (el par columna / fila) y devuelve un opcional Cuerda (la pieza de ajedrez). El valor de retorno debe ser opcional porque puede pasar una columna / fila no válida (como z9) en cuyo caso el subíndice regresa nulo.
Si los números de columna y fila son válidos, se utilizan para recuperar la pieza de ajedrez que está en el cuadrado correspondiente en el bidimensional. tablero formación:

Esta pieza de ajedrez luego se devuelve del captador.
Para probar este subíndice, en la parte inferior del patio de juegos, intente ingresar diferentes pares de columnas / filas. Por ejemplo, Figura 6 muestra los resultados de escribir dos pares de columna / fila válidos y uno no válido.
![]() |
| Figura 6 – Prueba del primer subíndice |
Mire más abajo en el patio de recreo para ver el segundo subíndice declarado para la clase Tablero de ajedrez:

Este subíndice acepta un fila parámetro de tipo Personaje y un columna parámetro de tipo En t (por ejemplo, “C”, 7) y devuelve la pieza de ajedrez como opcional Cuerda. Los subíndices pueden aceptar cualquier número y tipo de parámetros de entrada y devolver cualquier tipo.
En la parte inferior del patio de recreo, pruebe diferentes combinaciones de filas y columnas como en Figura 7.
![]() |
| Figura 7: Prueba del segundo subíndice |
Este subíndice necesita menos código de verificación de errores porque los parámetros de entrada están definidos de manera más estricta. Sin embargo, es menos natural de usar porque tiene que pasar cada carácter por separado en lugar de usar la combinación de fila / columna más familiar del primer subíndice.
Agregué este segundo subíndice para mostrarle cómo aceptar múltiples parámetros. En última instancia, elegiría el primer subíndice en una aplicación del mundo real porque, aunque inicialmente tuve que escribir un poco más de código, produjo una clase con una interfaz más intuitiva.
Conclusión
Las tuplas, las matrices multidimensionales y los subíndices proporcionan funciones de recopilación más avanzadas que puede implementar para casos especiales en sus aplicaciones de iOS. ¡Son otro conjunto de herramientas que puede aprender y desarrollar en su camino para ser un mejor desarrollador de aplicaciones!



















