Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Inferencia de Tipos
Genéricos
TypeAlias Tuplas
Enums
Extensiones Funciones
Pattern Matching
Closures
Opcionales
Structs Protocolos
WWW.EFECTOAPPLE.COM
GRACIAS
WWW.EFECTOAPPLE.COM
Antes de nada me gustaría agradecerte tu confianza.
Tanto si eres Desarrollador iOS como si estás pensando en serlo, estoy seguro
que este curso te será muy útil.
Espero que puedas encontrar mucho valor en las siguientes páginas. He puesto
todo de mi parte para que así sea.
Que lo disfrutes.
WWW.EFECTOAPPLE.COM
2
RECOMENDACION
WWW.EFECTOAPPLE.COM
Este curso está compuesto de decenas de ejemplos realizados en el
Playground de Xcode.
Una de sus ventajas es la posibilidad de ver en tiempo real los resultados del
código que vamos desarrollando. En la parte derecha del editor se irán
mostrando las salidas que nuestras lineas de código van generando.
WWW.EFECTOAPPLE.COM
4
BIENVENIDO
WWW.EFECTOAPPLE.COM
El objetivo de este curso es el de sentar las bases fundamentales de la última
versión de Swift (3.0) desarrollada por Apple.
Puede que tengas experiencia en desarrollos con Swift o puede que nunca
hayas trabajado con este lenguaje.
En cualquiera de los dos casos, estoy casi seguro al 100% que este curso puede
enseñarte muchas cosas.
En cada uno de los conceptos sobre los que vamos a trabajar, realizaremos
ejemplos prácticos que te servirán para asentar conocimientos. No tiene sentido
explicar teoría sin poder ver su aplicación práctica. El realizar estos ejemplos es
fundamental para aprovechar al máximo este curso.
¡COMENCEMOS!
WWW.EFECTOAPPLE.COM
6
INTRODUCCIÓN
WWW.EFECTOAPPLE.COM
SWIFT
TODO ES UN OBJETO
Por ejemplo, para representar números en Swift podemos utilizar los tipos Int,
Double o Float. Estos tipos de datos, son clases, con sus métodos, propiedades
de instancia y de clase. Son exactamente iguales que cualquier otro objeto. Por
tanto, no se tratan de tipos primitivos, como podríamos utilizar en Objective-C.
En estos dos ejemplos, puedes ver como las clases Int y Double tienen sus
propios métodos de clase:
WWW.EFECTOAPPLE.COM
8
VARIABLES Y CONSTANTES
WWW.EFECTOAPPLE.COM
9
INFERENCIA DE TIPOS
WWW.EFECTOAPPLE.COM
INFERENCIA DE TIPOS
WWW.EFECTOAPPLE.COM
11
INFERENCIA DE TIPOS
WWW.EFECTOAPPLE.COM
12
TYPEALIAS
WWW.EFECTOAPPLE.COM
TYPEALIAS
Es similar al typedef en C.
Puede que esto te parezca algo que no tiene mayor importancia, sin embargo te
será muy útil más adelante.
La sintaxis es la siguiente:
WWW.EFECTOAPPLE.COM
14
TUPLAS
WWW.EFECTOAPPLE.COM
TUPLAS
Podemos definir una tupla como una asociación rápida entre varios objetos.
Para especificar una tupla, los objetos que la forman deberán ir entre paréntesis.
Esos paréntesis unen los objetos en un único elemento: La Tupla.
Además, hay que tener en cuenta que los objetos de una tupla tienen tipo
propio y la tupla también.
Exactamente igual que las constantes y las variables, podemos definir tuplas
especificando su tipo o sin especificar su tipo.
Tal y como hemos comentado, los objetos de estas dos tuplas tienen su tipo
propio: El primer elemento es un Int, el segundo un String y el tercero un Int.
Además las tuplas tienen también su tipo. En este caso, ambas tuplas serán de
tipo (Int, String, Int)
¿Por qué?
Por eso el compilador nos avisa que algo estamos haciendo mal.
WWW.EFECTOAPPLE.COM
16
TUPLAS
Para finalizar habría que mencionar que las tuplas solo pueden almacenar datos.
No puedes almacenar funciones dentro de una tupla. Algo que si puedes hacer
por ejemplo con las Clases y las Structs.
Lo importante es que recuerdes que deberás usar Tuplas cuando tengas que
asociar dos objetos para algo muy sencillo.
WWW.EFECTOAPPLE.COM
17
PATTERN MATCHING
WWW.EFECTOAPPLE.COM
PATTERN MATCHING
El Pattern Matching es una de las características de Swift que más nos facilitan
la vida a los desarrolladores.
Dicho así no queda nada claro, así que vamos a verlo con un ejemplo:
“Ha declarado una tupla de 2 elementos y ahora me dice que asigne esa tupla a
dos variables diferentes. Así que creo que lo que quiere decir, es que asigne el
elemento 1 de la tupla a la variable 1 (padre) y el elemento 2 de la tupla a la
variable 2 (hija)”
Verás como se muestra por pantalla “Homer”. Por lo que el Pattern Matching ha
funcionado correctamente.
WWW.EFECTOAPPLE.COM
19
FUNCIONES
WWW.EFECTOAPPLE.COM
FUNCIONES
Cuando se dice que las funciones en Swift pueden devolver varias cosas, en
realidad a lo que se refieren es que pueden devolver tuplas. Y como sabemos
una tupla es una combinación de varios elementos. Después podemos utilizar el
Pattern Matching para obtener esos elementos de las tuplas.
Las funciones pueden aceptar otras funciones como parámetros. Al igual que
ocurre en JavaScript. Además las funciones pueden devolver otras funciones.
En cuanto a los nombres de los parámetros, hay que decir, que las funciones
pueden tener nombres internos y externos.
Puedes tener una función que tenga un parámetro y ese parámetro tiene un
nombre que solo es visible dentro de la función y tiene un nombre distinto que
se utiliza desde fuera.
Esta es la información mínima que tenemos que escribir para crear una función.
En este ejemplo, vemos que los parámetros únicamente tienen un nombre cada
uno. En este caso, podremos utilizar este nombre, tanto dentro de la función,
como fuera (Cuando realicemos la llamada a la función).
WWW.EFECTOAPPLE.COM
21
FUNCIONES
En este otro ejemplo, vemos como crearíamos un nombre externo para uno de
los parámetros:
WWW.EFECTOAPPLE.COM
22
FUNCIONES
Como puedes ver, para el último parámetro utilizamos su nombre externo. Esto
es obligatorio, ya que:
Como es posible que a estas alturas tengas un buen cacao con los nombres de
los parámetros (No te preocupes, yo estaba igual que tu la primera vez que vi
todo esto), aquí tienes un pequeño resumen sobre los nombres de los
parámetros:
Además de lo que acabamos de ver, debes saber que las funciones en Swift
pueden funcionar como los bloques en Objective-C. Es decir, pueden pasarse
como parámetros de otras funciones y pueden devolverse como valor de
retorno de otras funciones.
WWW.EFECTOAPPLE.COM
23
CLOSURES
WWW.EFECTOAPPLE.COM
CLOSURES
Lo único que cambian con respecto a las funciones que hemos visto en el
apartado anterior es su sintaxis, ya que todas las Closures son funciones. A esta
nueva sintaxis se le llama Sintaxis de Clausura.
RECUERDA
TODAS LAS CLOSURES SON FUNCIONES
ESTO ES SOLO SINTAXIS NUEVA
Hay que tener en cuenta que la inferencia de tipos funciona mucho mejor con la
sintaxis de clausura que con la sintaxis simple.
Además, lo normal es que la sintaxis de clausura sea más limpia que la sintaxis
simple.
WWW.EFECTOAPPLE.COM
25
CLOSURES
Como puedes ver, en la sintaxis simple, lo que hacemos es declarar una función
sum que le suma 1 al parámetro que le pasemos.
Esto convertido a sintaxis de clausura, se podría hacer declarando una
constante sum donde almacenaremos directamente una closure.
Esto se debe, a que en Swift, una linea de código no puede comenzar con una
closure. Por lo que tendremos que declarar una variable o una constante donde
almacenarla.
WWW.EFECTOAPPLE.COM
26
CLOSURES
Las closures nos permiten realizar ciertas “operaciones” que con las funciones
no seríamos capaces.
WWW.EFECTOAPPLE.COM
27
OPCIONALES
WWW.EFECTOAPPLE.COM
OPCIONALES
Primero, para tratar de explicar los Opcionales, me gustaría que viéramos un par
de ejemplos que nos harán ver que es lo que pasa en Swift cuando trabajamos
con variables y constantes no inicializadas.
Swift nos informa en tiempo de compilación para evitar que utilicemos de forma
accidental, variables que no han sido inicializadas.
Esto sucede con las variables, pero, ¿ocurre lo mismo con las constantes?
Veámoslo con otro ejemplo:
Como puedes ver, Swift nos permite dejar una constante sin inicializar. Incluso
nos permite inicializarla más adelante. Lo que si deja claro el compilador con
este error, es que solo nos permite inicializar las constantes una única vez.
WWW.EFECTOAPPLE.COM
29
OPCIONALES
Si volvemos al primer ejemplo que hemos visto, podría parecer que Swift no nos
permite trabajar con una variable que no tenga ningún valor, es decir, que sea
nil. Pero no es así.
Existe una forma de hacer que una variable quede sin inicializar y por tanto
almacene nil y que además podamos trabajar con ella. Para poder hacer esto
tendremos que utilizar los OPCIONALES.
Para ello, a la hora de declarar una variable tendremos que indicar de forma
explícita que esa variable si no le asignamos ningún valor, almacenará nil. Para
poder indicar esto, colocaremos el carácter ? justo después del tipo de la
variable. Aquí tienes un ejemplo:
Por tanto, la diferencia de Swift con otros lenguajes, es que si queremos que
una variable pueda almacenar el valor nil tendremos que especificarlo de forma
explícita al declarar esa variable, es decir, crearla como un OPCIONAL.
WWW.EFECTOAPPLE.COM
30
OPCIONALES
Hemos hecho algo tan simple como declarar un opcional de tipo Int, le hemos
asignado el valor 1 y al intentar sumarle 9 a esa variable obtenemos un error de
compilación.
¿Por qué?
Un opcional es como una caja que envuelve nuestra variable. Esta caja puede
contener el valor de la variable o puede contener nil. Puede que nosotros no lo
sepamos hasta que abramos esta caja. Para acceder al valor de la variable
tendremos que abrir esta caja. Para abrir esta caja tendremos que utilizar el
carácter !
Esta es la sintaxis que tendremos que utilizar cuando queramos acceder al valor
almacenado dentro de un opcional.
Para declarar una variable como opcional (y de esta manera permitir que
almacene nil) utilizaremos ?
Para acceder al valor de un opcional utilizaremos !
Así que recuerda, cuando necesites trabajar con variables que puedan
almacenar el valor nil, tendrás que especificarlo de forma explícita al declarar
esa variable y crearla como un opcional.
WWW.EFECTOAPPLE.COM
31
STRUCTS
WWW.EFECTOAPPLE.COM
STRUCTS
Swift las usa muchísimo. Para que te hagas una idea, Array y Dictionary no son
clases, sino structs.
struct Example_Struct {
//Propiedades que declaremos en la struct
} //Funciones que declaremos en la struct
WWW.EFECTOAPPLE.COM
33
STRUCTS
Si después queremos crear un objeto del tipo de esta struct, haremos esto:
Si te das cuenta, para crear un objeto de esta struct no hemos tenido que crear
ningún inicializador. Esto se debe a que todos los structs tienen un inicializador
por defecto, que nos permite pasarle los valores de cada variable.
WWW.EFECTOAPPLE.COM
34
STRUCTS
Estás viendo que los structs son muy similares a las clases de cualquier
lenguaje de programación. Sin embargo además de que no permiten la
herencia, tienen otra gran diferencia con respecto a las clases.
El hecho de que los structs estén en la pila tiene gran importancia. Hace que no
pueda haber dos referencias al mismo objeto, como si ocurre con las clases. Por
tanto, cuando queramos trabajar con structs, en lugar de pasarlas por
referencia, tendremos que pasarlas por valor.
Como esto no es posible con las structs, trabajamos directamente con los
objetos. Es decir, pasamos las variables por valor. Cuando asignamos una
variable de un struct a otro struct, en realidad estamos haciendo una copia
idéntica de ese objeto, con el cual trabajaremos a partir de ahora.
Se trata de una gran diferencia, que debes conocer entre clases y structs.
Como hemos comentado antes, las structs suelen ser inmutables. Por tanto, los
métodos de un Struct no deben modificar las propiedades del Struct.
Esa es la teoría.
Sin embargo, Swift nos ofrece un mecanismo para modificar las propiedades de
un Struct.
WWW.EFECTOAPPLE.COM
35
STRUCTS
Al ver que las structs son tan parecidas a las clases, tal vez te estés preguntando
cuando debemos usarlas.
Como normal general, utilizaremos las structs cuando no nos interese que
pueda modificarse el valor de un objeto desde diferentes sitios.
Las structs se utilizan mucho para enviar información de una cola a otra cuando
utilizamos Grand Central Dispatch.
WWW.EFECTOAPPLE.COM
36
ENUMS
WWW.EFECTOAPPLE.COM
ENUMS
El siguiente concepto que vamos a ver son las Enums. Se conocen también
como enumeraciones.
Las enums se pueden definir como un conjunto de datos de un mismo tipo, que
agrupa valores relacionados entre si.
Por tanto, podríamos declarar una enum llamada planet que almacenara este
conjunto de valores:
De esta forma, cada vez que utilicemos la variable planet, podremos especificar
uno de los valores de nuestra enum, utilizando un punto y asignándoselo a
cualquier variable que creemos.
WWW.EFECTOAPPLE.COM
38
ENUMS
O de esta otra:
Esto nos permite limitar nuestros planetas a los 8 que hemos definido en el
enum. De esta forma, podemos trabajar de forma más limpia, rápida y con
menos errores.
Como puedes ver, los enums, pueden sernos muy útiles cuando tenemos un
grupo de valores que queremos mantener agrupados y únicamente
utilizaremos un valor del grupo cada vez.
WWW.EFECTOAPPLE.COM
39
EXTENSIONES
WWW.EFECTOAPPLE.COM
EXTENSIONES
El siguiente concepto es junto con los Structs y los Protocolos, uno de los más
usados en Swift.
Pues las extensiones en Swift son muy similares a las categorías de Objective-C.
De forma simple podemos decir que nos permiten añadir cosas pero no cambiar
las que ya existen.
extension TipoAExtender{
//Declaramos todo lo que queramos añadir al Tipo Preexistente
}
WWW.EFECTOAPPLE.COM
41
EXTENSIONES
Estas dos funciones las tendrás que utilizar mucho a lo largo de tu proyecto, por
lo que la opción recomendada será utilizar una extensión para añadirlas por
ejemplo a la clase Double. De esta forma, cuando declares cualquier variable de
tipo Double, podrás acceder fácilmente a estos métodos para realizar las
conversiones.
Veamos como crearíamos una extensión de Double, que añadiera estos dos
métodos:
Como puedes ver, de forma muy simple hemos añadido dos funciones de
utilidad para nuestro proyecto a la clase preexistente Double.
Cada vez que queramos realizar una conversión, por ejemplo, de Celsius a
Fahrenheit podremos utilizar nuestra extensión:
WWW.EFECTOAPPLE.COM
42
EXTENSIONES
Imagina que queremos añadir una variable computada a la clase Int que realice
el cálculo de elevar al cuadrado un número cualquiera. Por ejemplo, podríamos
llamar a la variable computada: squared. Lo haríamos de la siguiente forma:
Así, cada vez que utilicemos la propiedad computada squared, nuestro número
será elevado al cuadrado:
Como has podido comprobar, las extensiones, son una característica muy útil de
Swift que nos permite aumentar las funcionalidades del lenguaje y facilita
nuestra labor como desarrolladores.
WWW.EFECTOAPPLE.COM
43
PROTOCOLOS
WWW.EFECTOAPPLE.COM
PROTOCOLOS
Sin ir más lejos, la librería estándar de Swift está construida con protocolos.
En lugar de trabajar con clases y superclases, Swift está más enfocado en el uso
de protocolos para ampliar las funcionalidades de nuestras clases.
Se podría decir, que son la opción por defecto para extender el lenguaje.
Como puedes ver, se utiliza la palabra reservada protocol, seguida del nombre
del protocolo y después del nombre se pueden añadir otros protocolos, que
implemente nuestro protocolo actual.
WWW.EFECTOAPPLE.COM
45
PROTOCOLOS
Para hacer esto simplemente tendrás que añadir entre llaves {get set} en el
primer caso y solo {get} si quieres que tu propiedad sea de solo lectura. De esta
forma, nadie desde fuera de la clase podrá modificar su valor.
WWW.EFECTOAPPLE.COM
46
PROTOCOLOS
WWW.EFECTOAPPLE.COM
47
GENÉRICOS
WWW.EFECTOAPPLE.COM
GENÉRICOS
Como has podido ir viendo a lo largo de los conceptos que hemos ido
explicando, es un lenguaje bastante estricto en lo relacionado a trabajar con
diferentes tipos de datos al mismo tiempo.
Sin ir más lejos, tienes como ejemplo las colecciones de Swift. Unicamente
pueden almacenar objetos del mismo tipo.
Otro ejemplo podría ser cuando trabajamos con funciones y especificamos los
tipos de sus parámetros y el tipo de dato que devuelven. Si queremos utilizar
otros tipos de datos con esta función no podremos hacerlo.
Esto genera una serie de problemas, que vamos a ver con un ejemplo muy
claro.
Imagina que desarrollamos una función muy simple. Queremos que reciba
como parámetro 2 objetos Int y devuelva una tupla (Int, Int) con esos dos
objetos:
Pero…
WWW.EFECTOAPPLE.COM
49
GENÉRICOS
Con los conceptos que hemos visto hasta ahora, Swift no nos permite crear una
función “genérica” que acepte diferentes tipos de datos.
Esto nos obligaría a crear una función específica para trabajar con Strings:
Si para cada tipo de dato, tenemos que generar una función diferente con el
mismo código, lo que vamos a obtener es una cantidad enorme de código
repetido, obligándonos a trabajar por duplicado y triplicado.
Así que para solucionar este problema, Swift nos ofrece Los Genéricos.
WWW.EFECTOAPPLE.COM
50
GENÉRICOS
Utilizamos la letra T para especificar que los tipos de los parámetros son
genéricos.
Como ves, se marcan entre <> los tipos de los parámetros que vayamos a utilizar
y luego se asignan a cada uno de los parámetros. T también se utiliza en el tipo
de retorno.
WWW.EFECTOAPPLE.COM
51
GENÉRICOS
Para trabajar con objetos de tipo Int y String al mismo tiempo tendríamos que
haber declarado la función de esta otra forma:
Lo que nos permitirá generar código mas eficiente y con menos esfuerzo.
WWW.EFECTOAPPLE.COM
52
DESPEDIDA
WWW.EFECTOAPPLE.COM
Estos son los conceptos fundamentales de Swift 3.0 que deberías conocer si
pretendes dominar el nuevo lenguaje de Apple.
Espero que este curso te haya ayudado a aumentar tus habilidades como
Desarrollador iOS o por lo menos hayas encontrado algo de valor en sus
páginas.
WWW.EFECTOAPPLE.COM
54
WWW.EFECTOAPPLE.COM