Swift From Scratch Colecciones y Tuples

En el artículo anterior, aprendió acerca de las variables, constantes y algunos de los tipos de datos comunes, como enteros, flotantes y cadenas. En este artículo, nos acercamos a las colecciones. La biblioteca estándar de Swift define tres tipos de colección: conjuntos, matrices y diccionarios. Vamos a empezar con matrices.

1. Arrays

Si está familiarizado con Objective-C, JavaScript o PHP, entonces no será difícil entender los arreglos. Una matriz es una colección ordenada de valores de índice cero. Pero hay algunas diferencias importantes entre los arreglos para Swift y otros lenguajes de programación..

Tipo

La primera diferencia importante en comparación con las matrices en Objective-C es que los valores almacenados en una matriz son siempre del mismo tipo. Al principio, esto puede parecer una limitación significativa, pero en realidad no lo es. De hecho, esta limitación tiene una ventaja importante. Sabemos exactamente qué tipo recuperamos cuando le pedimos a la matriz uno de sus valores.

Otra diferencia clave es el tipo de valores que una matriz puede almacenar. En Objective-C, una matriz solo puede almacenar valores de un tipo de clase. Swift no tiene esta limitación. Una matriz en Swift puede almacenar cadenas, enteros, flotantes e instancias de clase. Cómo funciona esto y por qué esto es posible en Swift se aclarará más adelante en esta serie cuando cubramos clases y estructuras.

Declaración

Si bien hay varias formas de crear una matriz, debe tener en cuenta que Swift necesita saber qué tipo de valores planea almacenar en la matriz. Cree un nuevo área de juegos en Xcode, como hicimos en el artículo anterior, y agregue las siguientes líneas a su área de juegos.

var array1: Array var array2: [String] var array3 = ["Apple", "Pear", "Orange"]

La primera y segunda líneas significan lo mismo. La segunda línea es sólo taquigrafía. Los corchetes que envuelven el Cuerda la palabra clave le dice a Swift que estamos declarando una matriz que solo puede contener Cuerda objetos.

Puede leer la primera línea de código como: "Declaramos una variable llamada array1 de tipo Formación que solo puede contener Cuerda objetos ". Los dos puntos significan de tipo.

La tercera línea nos muestra cómo inicializar una matriz utilizando un literal de matriz. Los literales de matrices son muy similares a los literales de matrices en Objective-C. La principal diferencia es la ausencia de @ Símbolo que precede a los corchetes y los literales de cadena.

También hay una forma elegante de inicializar una matriz con un número predefinido de valores predeterminados. La sintaxis puede ser confusa al principio, pero tómese un momento para dejar que se hunda.

var a = [String] (repitiendo: "Test", cuenta: 5)

La matriz resultante contiene cinco cadenas, con cada cadena igual a "Prueba". Para comprender mejor la inicialización anterior, eche un vistazo a las siguientes dos líneas de código en las que inicializamos una matriz vacía de cadenas.

var b = Array() var c = [String] ()

No te preocupes si todavía estás confundido. Exploraremos la sintaxis con más detalle una vez que comencemos a tratar con clases y funciones. En este artículo, solo nos centramos en las colecciones..

Mutabilidad

Un aspecto de Swift que pronto apreciará es cómo declarar colecciones mutables. El fragmento de código anterior, por ejemplo, declara tres matrices mutables. Una matriz mutable se define utilizando el var palabra clave. Es así de simple.

Si no desea que una matriz sea mutable, use el comando dejar palabra clave en su lugar. Swift pretende ser intuitivo y fácil de usar, y su implementación de mutabilidad es un ejemplo perfecto de ese objetivo.

Obtención y configuración de valores

Para acceder a los valores almacenados en una matriz, usamos la misma sintaxis de subíndice que en Objective-C. En el siguiente ejemplo, pedimos array3 Para su segundo elemento, la cuerda. "Pera".

array3 [1]

Reemplazo del valor almacenado en el índice 1 es tan simple como asignar un nuevo valor usando la misma sintaxis de subíndice. En el siguiente ejemplo, reemplazamos "Pera" en el índice 1 con "Melocotón".

array3 [1] = "Peach"

Esto solo es posible porque la matriz es mutable, es decir, usamos el var palabra clave para declarar la matriz. Mutar una matriz constante no es posible. Existen técnicas más avanzadas para manipular los contenidos de una matriz, pero el concepto subyacente es el mismo.

Fusionar dos matrices es tan simple como sumarlos. En el siguiente ejemplo, declaramos y fusionamos dos arreglos inmutables. Tenga en cuenta que la matriz resultante, do, no tiene que ser mutable para que esto funcione.

let a = [1, 2, 3] let b = [4, 5, 6] let c = a + b

Sin embargo, es clave que los valores almacenados en una y segundo Son del mismo tipo. La razón debería ser obvia a estas alturas. Como mencioné anteriormente, los valores almacenados en una matriz deben ser del mismo tipo. El siguiente ejemplo resulta en un error.

let a = [1, 2, 3] let b = [1.5, 5.2, 6.3] let c = a + b

Para añadir una matriz a una matriz mutable, usamos el += operador. Tenga en cuenta que el operando de la derecha es una matriz. Esta operación no funcionaría si eliminamos los corchetes que rodean 4.

var a = [1, 2, 3] a + = [4]

Operaciones

Las matrices son objetos en los que puede realizar una amplia gama de operaciones. Las matrices exponen una serie de funciones o métodos. Para invocar un método en un objeto, utiliza la notación de puntos. Agregue la siguiente línea a su área de juegos para agregar un artículo a array3.

array3.append ("Cherry")

Veamos cuantos artículos. array3 contiene mediante la inspección del valor de su contar propiedad. Esto produce 4 al panel de resultados.

array3.count

También es posible insertar un elemento en un índice específico invocando la matriz insertar (_: en :) método como se muestra a continuación. los insertar (_: en :) El método acepta más de un parámetro, y la sintaxis puede parecer un poco extraña al principio.

array3.insert ("Podar", en: 2)

Al igual que Objective-C, Swift admite parámetros con nombre para mejorar la legibilidad. El resultado es que el código es más fácil de leer y entender, y las funciones o los métodos no necesitan mucha explicación en términos de lo que hacen. Está claro, por ejemplo, que la insertar (_: en :) método inserta un elemento en el índice 2.

Si bien Swift es más conciso y menos detallado que Objective-C, admite parámetros con nombre. Si viene de PHP, Ruby o JavaScript, entonces esto es algo a lo que se debe acostumbrar..

Métodos de conveniencia

Lo que realmente disfruto de Swift son las propiedades y métodos de conveniencia similares a Ruby de la biblioteca estándar de Swift. Una matriz, por ejemplo, tiene una esta vacio Propiedad que le dice si la matriz contiene algún elemento. Esto no es más que una taquigrafía para comprobar la matriz contar propiedad. El resultado, sin embargo, es un código más conciso y fácil de leer..

array3.isEmpty

2. Diccionarios

Los diccionarios se comportan de manera muy similar a los diccionarios en Objective-C. Un diccionario almacena una colección desordenada de valores. Cada valor en el diccionario está asociado con una clave. En otras palabras, un diccionario almacena una cantidad de pares clave / valor.

Tipo

Al igual que con las matrices, las claves y los valores almacenados en un diccionario deben ser del mismo tipo. Esto significa que si le pide a un diccionario el valor de una clave en particular, sabrá qué tipo de diccionario devolverá.

Declaración

Declarar un diccionario es similar a declarar una matriz. La diferencia es que debe especificar el tipo para las claves y los valores. El siguiente ejemplo muestra tres formas de declarar un diccionario..

var dictionary1: Diccionario var dictionary2: [String: Int] var dictionary3 = ["Apple": 3, "Pear": 8, "Orange": 11]

La segunda línea es la taquigrafía de la primera línea. Las claves de estos diccionarios deben ser de tipo. Cuerda mientras que se espera que los valores sean de tipo En t. los var palabra clave indica que los diccionarios son mutables.

Puede leer la primera línea de código como: "Declaramos una variable llamada diccionario1 de tipo Diccionario que solo puede contener claves de tipo Cuerda y valores de tipo En t."

La tercera línea ilustra cómo podemos inicializar un diccionario usando un diccionario literal. Esto es similar a la sintaxis que utilizamos en Objective-C, pero tenga en cuenta que las llaves se reemplazan por corchetes y el literal no tiene el prefijo @ símbolo.

Obtención y configuración de valores

El acceso a los valores es similar al acceso a los valores de una matriz. La única diferencia es que utiliza la clave en lugar del índice del valor al que necesita acceder. El siguiente ejemplo lo ilustra.

let value = dictionary3 ["Apple"] print (value)

Notarás que Xcode nos dice que el valor de valor no es 3, pero Opcional (3). ¿Qué significa esto? Swift usa opcionales para envolver valores que pueden ser una de dos cosas, un valor o nulo. No te preocupes por las opciones en este punto. Nos centraremos en los opcionales en el próximo artículo de esta serie. Permítanme decirles que los opcionales son otro concepto clave del lenguaje de programación Swift..

Es interesante señalar que la sintaxis para acceder a un valor de un diccionario es idéntica a la de las matrices si las claves del diccionario son de tipo En t. Eche un vistazo al siguiente ejemplo para ver a qué me refiero..

var dictionary4 = [0: "Apple", 1: "Pear", 2: "Orange"] deja fruit = dictionary4 [0]

Operaciones

Al igual que con las matrices, la biblioteca estándar de Swift define una amplia gama de operaciones que puede realizar en los diccionarios. Puede pedir a un diccionario su número de pares clave / valor a través de su contar propiedad. Eliminar un par de clave / valor es fácil e intuitivo, como lo ilustra el siguiente ejemplo. Por supuesto, esto solo es posible si el diccionario es mutable..

dictionary4.removeValue (forKey: 0)

Cuando comiences a aprender Swift, es posible que te encuentres con fragmentos de código que parezcan extraños o confusos. Eche un vistazo a la siguiente línea, en la que primero declaramos un diccionario y luego eliminamos sus pares clave / valor.

var dictionary = [String: Int] () dictionary ["Oranges"] = 2 dictionary ["Apples"] = 10 dictionary ["Pears"] = 5 dictionary = [:]

Tienes que admitir que la última línea se ve un poco rara. Porque Swift conoce los tipos de claves y valores que se pueden almacenar en diccionario, Vaciar el diccionario es tan simple como asignarle un diccionario vacío..

No es necesario especificar los tipos de claves y valores en este caso, porque ya lo hicimos cuando declaramos el diccionario en la primera línea. Esto señala otro detalle importante, es decir, el tipo de valores que puede almacenar en arrays y diccionarios no puede cambiar una vez que se declara la colección..

3 juegos

Los conjuntos son muy similares a los arreglos en que almacenan una colección de valores del mismo tipo. Pero hay varias diferencias importantes. Los elementos almacenados en un conjunto no están ordenados, y cada elemento solo puede aparecer una vez en un conjunto.

Declaración

Trabajar con conjuntos es un poco diferente de trabajar con matrices. Eche un vistazo a los siguientes ejemplos en los que declaramos tres conjuntos. los serie 1 la variable es de tipo Conjunto, Un conjunto que solo puede contener valores de tipo. Cuerda.

var set1: conjunto var set2 = Set() var set3: Set = ["Manzana", "Pera", "Naranja"]

los set2 la variable es un conjunto vacío, y usamos una matriz literal en el tercer ejemplo para crear y completar un conjunto mutable que contiene tres valores. Gracias a la inferencia de tipo de Swift, podemos omitir el tipo de conjunto.

var set3: Set = ["Apple", "Pear", "Orange"]

Conjuntos de manipulación

Trabajar con conjuntos es similar a trabajar con matrices. Podemos solicitar el número de elementos almacenados en un conjunto inspeccionando el conjunto contar propiedad.

set3.count

Insertar un elemento es fácil. Debido a que los elementos de un conjunto no están ordenados, no necesitamos especificar la ubicación del nuevo elemento.

set3.insert ("Podar")

Y lo mismo se aplica a la eliminación de un elemento de un conjunto..

set3.remove ("naranja")

También puedes preguntar a un conjunto si contiene un elemento en particular..

set3.contains ("Apple")

Arreglos o Conjuntos

A menudo me refiero a los conjuntos como versiones ligeras de arreglos. Si el orden de los elementos no es importante o si quiere asegurarse de que cada elemento solo pueda aparecer una vez en una colección, entonces los conjuntos son el camino a seguir..

4. Tuplas

Te van a encantar las tuplas. Las tuplas no son colecciones, pero al igual que las colecciones, también agrupan varios valores. Al igual que las matrices y los diccionarios, las tuplas pueden contener valores de cualquier tipo. La diferencia clave, sin embargo, es que los valores almacenados en una tupla no necesitan ser del mismo tipo. Veamos un ejemplo para explicar esto con más detalle..

importar Foundation var currency = ("EUR", 0.81) var time = (Date (), "Este es mi mensaje".) var email = ("Bart Jacobs", "[email protected]")

El primer ejemplo declara una tupla llamada moneda eso es de tipo (Cuerda, Int). La segunda tupla, hora, contiene una Fecha instancia y una cadena literal. Los valores almacenados en correo electrónico son de tipo Cuerda, lo que significa correo electrónico es de tipo (Cuerda, Cuerda).

Valores de acceso

Índices

Para acceder a un valor almacenado en una tupla, utiliza el índice que corresponde con el valor que le interesa.

var rate = currency.1 var message = time.1 var name = email.0

Xcode nos muestra los índices de cada valor almacenado en una tupla en el panel de resultados del área de juegos a la derecha.

Los nombres

Para mejorar la legibilidad, puede nombrar los valores almacenados en una tupla. El resultado es que puede acceder a los valores de la tupla a través de sus nombres en lugar de sus índices. Declarar una tupla es ligeramente diferente en ese caso.

var currency = (nombre: "EUR", tasa: 0.81) let currencyName = currency.name let currencyRate = currency.rate

Descomposición

Hay una segunda forma más elegante de trabajar con los valores almacenados en una tupla. Eche un vistazo al siguiente ejemplo en el que descomponemos los contenidos de moneda.

let (currencyName, currencyRate) = currency

El valor de moneda en el índice 0 se almacena en currencyName, y el valor en el índice 1 se almacena en taza de cambio. No hay necesidad de especificar el tipo de currencyName y taza de cambio ya que Swift infiere el tipo de los valores almacenados en moneda. En otras palabras, currencyName es de tipo Cuerda, y taza de cambio es de tipo Flotador.

Si solo te interesan los valores específicos de una tupla, puedes usar un guión bajo para indicar a Swift qué valores no te interesan..

let (currencyName, _) = currency

Conclusión

Las matrices y los diccionarios son componentes fundamentales de casi todos los lenguajes de programación, y Swift no es diferente. Si bien las colecciones se comportan de manera un poco diferente en Swift, no se tarda mucho en familiarizarse con los tipos de colección de Swift si ha trabajado con arrays y diccionarios en otros lenguajes de programación. En el siguiente tutorial, exploramos opciones y controlamos el flujo..

Aprende rápido

Hemos creado una guía completa para ayudarlo a aprender Swift, ya sea que esté comenzando con lo básico o si desea explorar temas más avanzados..

Si desea comenzar a utilizar el lenguaje Swift rápidamente, consulte nuestro curso sobre la creación de aplicaciones iOS con Swift.

O echa un vistazo a algunos de nuestros otros tutoriales y cursos sobre el desarrollo de Swift y iOS!