Anda di halaman 1dari 57

ndice

ndice .............................................................................................................................................................2
Bienvenida ...................................................................................................................................................3
Objective-C o Swift? Qu lenguaje aprender para programar en iOS ................................4
Swift vs Objective-C: 5 preguntas indispensables para decidirse por un lenguaje ..........9
Introduccin a la sintaxis de Swift y Objective-C ....................................................................... 13
Conceptos fundamentales de Swift ................................................................................................ 24
9 ideas interesantes de Swift sacadas de otros lenguajes ...................................................... 30
Swift y los nulos...................................................................................................................................... 43
Estructura de una aplicacin iOS ..................................................................................................... 49
El ciclo de vida de una aplicacin iOS ............................................................................................ 54
Y ahora qu?.......................................................................................................................................... 56

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

Bienvenida
Te damos la bienvenida a este eBook sobre desarrollo para iOS
Este documento est dirigido a programadores que tienen inters en programar
para dispositivos mviles de Apple (iPhone y iPad), y que quieren tener un primer
contacto con los dos lenguajes disponibles para esta plataforma: Objective-C y
Swift.
As, no se trata de un eBook apropiado para gente que nunca ha programado.
Aunque todo lo explicado es bsico, para entenderlo es necesario disponer de unos
conocimientos mnimos de programacin.
No se trata tampoco de un documento de iniciacin a estos lenguajes, sino que
con este eBook perseguimos bsicamente tres objetivos:
Ayudarte a decidirte por uno u otro lenguaje en funcin de tus necesidades
Que tengas un primer contacto con ellos para "perderles el miedo"
Que conozcas algunos conceptos bsicos de ambos para poder empezar con
mayor facilidad
Esperamos aportar nuestro granito de arena en tu camino hacia el aprendizaje :-)

Los mejores cursos online para programadores


campusMVP.es

Objective-C o Swift? Qu lenguaje aprender para


programar en iOS
por Jos Manuel Alarcn

Como dice el viejo chiste: "Cmo te comeras un elefante?... Pues trocito a trocito,
claro. "

Aprender a programar en un nuevo sistema operativo es como comerse un elefante:


no puedes hacerlo de golpe y si quieres tener xito debes ir poco a poco, quemando
etapas.
Uno de los principales mitos del desarrollo para iOS es que es difcil por culpa
de Objective-C, un lenguaje crptico y propenso a errores que no perdona los fallos.
Y el mito moderno derivado de este es que Swift, por el contrario, facilita mucho las
cosas ya que su sintaxis es ms sencilla y directa.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

Sin embargo la realidad es que la verdadera barrera para aprender a programar


para iOS es dominar Cocoa Touch! Cocoa Touch es la API para programar
aplicaciones para el sistema operativo de la manzana, y ofrece una capa de
abstraccin por encima de iOS:

Es una API enorme que incluye tambin la creacin de interfaces de usuario e


interacciones, y que adems tiene multitud de paradigmas propios que pueden
resultar extraos a muchos programadores que vienen de otros entornos.

Objective-C y Swift son el pegamento que une todo lo que ofrece Cocoa
Touch. Es decir, Cocoa Touch es la base que utilizan tanto Objective-C
como Swift.

Por ello, aprender un lenguaje o el otro realmente es una cuestin casi "esttica" y de
preferencia, puesto que lo verdaderamente importante es aprender lo que hay
debajo de ambos.

Los mejores cursos online para programadores


campusMVP.es

Pros y contras
Dado que Swift es el nuevo y moderno lenguaje que est impulsando Apple, merece
la pena aprender tambin Objective-C o vamos directamente a por Swift?
Sin duda Swift es el futuro y adems es un lenguaje moderno que ofrece muchas
ventajas frente a Objective-C:
Cdigo ms conciso, claro y limpio que facilita la escritura y la comprensin
Ofrece tipado fuerte de datos, inferencia de tipos, sobrecarga de operadores...
Elimina los punteros, controla el desbordamiento de variables
Gestin automtica de la memoria
Genricos
Estructuras con mtodos, extensiones y protocolos
Facilita mucho la depuracin
Facilita el uso de patrones de programacin funcional
Etc...
Por el contrario Objective-C es mucho menos transigente con los errores, tiene una
sintaxis complicada y adems ofrece ciertos conceptos que resultan complejos para
programadores que vienen de otros lenguajes, como:
Protocolos
Categoras y selectores (aunque estos ltimos se usan en Swift tambin tienen
mucha ms friccin)
Dispatch dinmico
First responders
Bloques
Etc...
Ante este panorama, claramente, parece que lo inteligente sera aprender
directamente Swift no?

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

La realidad es que, aunque Swift resulte ms fcil para un programador que viene de
otras plataformas, Objective-C se puede aprender en cuestin de unas pocas horas
tambin, aunque parezca mentira.

Dado que ambos deben utilizar Cocoa Touch por debajo y esta API est escrita en su
totalidad con Objective-C, aunque programes en Swift no te puedes librar de conocer
igualmente los conceptos avanzados propios del otro lenguaje, como los principios
de orientacin a objetos de Objective-C, punteros, protocolos, delegados, montones,
pilas.... simplemente para poder usar la base. Es decir, aunque programes en Swift
debes jugar con las reglas de Objective-C. Vamos, es como aquel famoso anuncio de
los 90 del juego Scattergories ;-) .

Por ello, en mi opinin lo ms interesante es aprender los dos lenguajes. Swift es


el futuro pero Objective-C es la base.
Conocer Objective-C adems de Swift es bueno porque:
Cocoa Touch est basado en este lenguaje y conocerlo te ayudar a
comprender mejor sus paradigmas.
Las principales bibliotecas para iOS estn escritas con Objective-C.
Existen infinidad de aplicaciones creadas desde 2007 a 2014-2015 en
Objective-C. Si lo quieres para crear aplicaciones nuevas solamente, esto no te
importar demasiado, pero si vas a trabajar para empresas te tocar mantener
y retocar cdigo anterior, para lo cual es indispensable conocer el lenguaje.

Los mejores cursos online para programadores


campusMVP.es

Es mucho ms fcil visualizar la ejecucin de tus programas a bajo nivel y


detectar problemas de memoria o CPU cuando trabajas en Objective-C que
con Swift.
Mucha de la documentacin que existe para Swift parte de la base de que ya
conoces Objective-C.
No son excluyentes: ambos pueden trabajar en equipo, pudiendo crear
programas con partes escritas con los dos.
De esta forma aunque luego en el da a da programes con Swift, en aquellas
ocasiones en las que necesites sacar de tu chistera los conocimientos de Objective-C
vers que te resultan indispensables y tenerlos marcar la diferencia.
Es por esto que en nuestro excelente curso on-line de programacin para iOS no
hemos querido dejar fuera ninguno de los dos lenguajes y promovemos el estudio de
ambos. Ha quedado un curso largo e intenso, pero los alumnos salen mejor
preparados que con cualquier otro curso sobre esta temtica, con una base slida no
solo para crear aplicaciones, sino para dominar los conceptos y resolver problemas.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

Swift vs Objective-C: 5 preguntas indispensables


para decidirse por un lenguaje
por campusMVP.es

Swift es el nuevo lenguaje de Apple, llamado a sustituir al vetusto Objective-C en el


que se han basado histricamente todos los desarrollos para iPhone/IPad y Mac OS
X. Se lanz oficialmente durante el verano de 2014, o sea, ya bastante tiempo, pero
sigue siendo el "nuevo" y todava quedan dudas sobre todo lo que lo rodea,
especialmente si vas a iniciarte en la programacin para iPhone/iPad o Mac OS X.
En este captulo vamos a tratar de contestar a las dudas ms habituales para ayudarte
a comparar mejor ambos lenguajes y a tomar decisiones respecto a su aprendizaje.
Vamos all!

1.- Estoy empezando a programar para iOS, debo aprender solo


uno de los dos lenguajes o ambos?
Bueno, como casi siempre, la respuesta depende de muchos factores, pero
principalmente de qu tipo de desarrollos esperes realizar en el futuro:
1. Si eres un desarrollador freelance y vas a empezar ahora a trabajar creando
tus propias aplicaciones desde cero, entonces aprender solamente Swift puede
ser una opcin. El motivo es que al no tener aplicaciones antiguas que
mantener puedes permitirte el lujo de trabajar solamente con el nuevo
lenguaje, despreocupndote del cdigo heredado.
2. Si vas a trabajar para una empresa (o varias), entonces es casi indispensable
que aprendas ambos lenguajes. Salvo que tengas la suerte de que te toque
una empresa que empieza de cero el desarrollo, lo normal ser que exista
mucho cdigo anterior escrito en Objective-C y que no sea fcil (ni incluso
viable) migrarlo a Swift. Si no sabes Objective-C tienes un handicap respecto a
otros desarrolladores. Adems, incluso aunque tu nueva empresa parta de
cero, es ms que probable que no te quedes en ella toda la vida, y la siguiente
es muy posible que tenga cdigo heredado.

Los mejores cursos online para programadores


campusMVP.es

En cualquier caso, y sea cual sea tu circunstancia o la idea que tengas, aprender
Swift es indispensable, pero aprender Objective-C es ms que recomendable
porque tarde o temprano tendrs que pelearte con l, puesto que existen miles de
bibliotecas y cdigo abierto que solo existe en este lenguaje. De hecho la propia base
del desarrollo para iOS y Mac, Cocoa, est escrito en Objective-C, y es til conocer
algunos de sus conceptos para entender mejor su funcionamiento cuando programes
en Swift.
En unos cuantos aos s que es probable que, finalmente, puedas prescindir de
Objective-C y usar solamente Swift. Hoy por hoy todava es complicado.

2.- Cul es ms fcil de aprender?


Aqu se da frecuentemente una confusin de dos conceptos que no tienen nada que
ver: una cosa es que Swift sea ms fcil de escribir y de leer, y otra muy diferente que
sea ms fcil de aprender.
De hecho hay mucha gente que opina todo lo contrario al saber popular: que
Objective-C es ms fcil de aprender que Swift.
En primer lugar, Objective-C no es ms que una extensin de C, que es uno de los
lenguajes ms utilizados del mundo y mucha gente ya conoce. En ese sentido saltar
de C a Objective-C debera ser bastante sencillo a pesar de sus "cosas".
Incluso aunque partas de cero, si lo comparamos con Swift, este ltimo tiene muchas
ms construcciones y reglas "esotricas" especficas que debes aprender que en el
caso del antiguo lenguaje. Por ejemplo todo lo relacionado con los valores
opcionales y el uso de ? y ! para indicar tus intenciones respecto a stos. O los
propios genricos, que si bien son muy potentes y permiten hacer cosas interesantes,
son ms complejos de entender que algunos conceptos de Objective-C y hacen a
Swift ms complicado de aprender.
Otro punto a favor de Objective-C es que Apple tuvo que crear muchos conceptos de
Swift pensando en Objective-C para que pudieran interoperar. Por eso muchas cosas,
desde los objetos, la herencia, las referencias fuertes y dbiles... estn creados a
imagen y semejanza de Objective-C, por lo que no te quedar ms remedio que
aprenderlo un poco aunque no quieras.
Objective-C obliga a los programadores a ser ms explcitos respecto a lo que
quieren hacer en muchas ocasiones. Esto puede parecer malo y que dificulta el
aprendizaje, pero en realidad no es as. En Swift se delegan muchas cosas al
compilador y esto hace que el cdigo sea ms limpio, pero que sea necesario

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

10

conocer a fondo el contexto en el que se est ejecutando para entender las


implicaciones. Y esto es ms difcil de aprender. Se puede ver fcilmente con un
ejemplo real: las matrices. En Objective-C puedes definir un NSArray cuando no
quieres modificar sus contenidos, y un NSMutableArray si tienes intencin de aadir,
quitar o modificar elementos ms adelante. En el primer caso se producir un error si
intentas modificar la matriz, y en el segundo caso la intencin est clara a partir del
nombre, por lo que es mucho ms sencillo y menos propenso a errores. En el caso de
Swift la cosa cambia bastante. Puedes declarar una matriz con let (inmutable) o con
var (mutable), pero incluso en el primer caso te permitir cambiar el contenido de la
matriz mientras no la redimensiones. Es decir, aunque en teora es inmutable porque
la declaras con let, en la prctica puedes cambiar sus contenidos porque son
referencias. En Objective-C las intenciones son ms claras.
En definitiva, es cierto que Objective-C es un lenguaje ms "duro" de escribir y de leer
que Swift, que es mucho ms agradable. Pero eso no quiere decir que sea ms
complicado de aprender, sino incluso puede significar justo lo contrario.

3.- Ya s Objective-C. Si ahora quiero aprender Swift tengo que


partir de cero?
En absoluto. Si ya sabes Objective-C significa que ya sabes tambin Cocoa y/o Cocoa
Touch, as como XCode, y por lo tanto tienes mucho camino andado.
La parte ms grande y complicada de aprender a programar aplicaciones para iOS o
Mac OS X, es sin duda conocer los cientos (o miles) de APIs y bibliotecas especficas
que existen y el manejo de XCode. As que si esa parte la tienes cubierta solo te
queda aprender el lenguaje. ste tiene sus conceptos y tcnicas particulares, adems
de una sintaxis muy diferente a Objective-C, pero tienes mucho camino ya andado.
Una vez que domines los conceptos bsicos y te acostumbres a escribir con la sintaxis
de Swift, ya no habr vuelta atrs. Y podrs aprovechar casi todo lo que ya sabes.

4.- Hay cosas que se puedan hacer en Objective-C que no se


puedan hacer en Swift, y viceversa?
Pues s; en ambos casos, lo cual refuerza la tesis de que es bueno conocer los dos
lenguajes.
Por ejemplo, Swift tiene muchas cosas nuevas que no existan en Objective-C o no se
podan hacer fcilmente, como: genricos, tuplas, inferencia de tipos, espacios de
nombres, parmetros opcionales...
Los mejores cursos online para programadores
campusMVP.es

11

Pero Objective-C tiene algunas cosas especficas que no hay en Swift, como la
potente capacidad de reflexin que tiene este lenguaje, la posibilidad de enviar
mensajes a nil, enlazar y embeber cdigo escrito en C, declarar y exponer estructuras
C...
Aunque es cierto que algunas de estas cuestiones son algo esotricas y no tendrn
importancia en el da a da, disponer de un conjunto de herramientas ms amplio
siempre es recomendable.
Es interesante consultar la gua de Apple para interoperatividad entre Swift y Cocoa y
Objective-C.

5.- Con qu lenguaje me quedo para trabajar?


De entrada, como se deduce de todo lo anterior, lo recomendable sera que
aprendieras los dos. De hecho aprendiendo primero Objective-C y en paralelo las
APIs ms importantes, pasar a Swift te resultar mucho ms fcil.
Ahora bien, a la hora de escoger tu lenguaje principal en el que trabajar, sin duda
debera ser Swift por muchos motivos, entre los que destacan los siguientes:
Es ms sencillo de escribir y de leer, y el cdigo es ms escueto.
Es ms fcil de mantener.
Es ms seguro para desarrollar, ya que oculta mucha complejidad y gestiona la
memoria de manera automtica.
Tus aplicaciones se ejecutarn ms rpido. Al no tener que depender de ciertas
cuestiones heredades de C, Apple ha optimizado mucho el lenguaje y el
compilador pudiendo ganar rendimiento en casi todos los casos.
Swift permite evolucionar las aplicaciones ms rpido ya que soporta
bibliotecas dinmicas.
Es ms fcil hacer pruebas, gracias a los Playgrounds.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

12

Introduccin a la sintaxis de Swift y Objective-C


por campusMVP.es
Vamos a echarle un vistazo a la sintaxis de los lenguajes Swift y de Objective-C para
hacer una comparacin rpida y conocer sus principales diferencias en lo bsico.
Lgicamente esto es tan solo una muy breve introduccin donde veremos ejemplos
sencillos, pero que creemos que te resultarn suficientemente reveladores como para
arrancar.

Constantes y Variables
Para declarar una variable en Swift usaremos la palabra reservada var :

var numero = 1

En Objective-C:

int numero = 1;

Los mejores cursos online para programadores


campusMVP.es

13

Las diferencias principales son que, en Swift, no hay que poner el punto y coma al
final ni hay que definir el tipo de variable de que se trata. Esto se debe a que Swift
permite la inferencia de tipos y es capaz de entender que la variable es un nmero
debido a su valor inicial.
Aunque si quieres, puedes definir tambin el tipo de variable explcitamente:

var numero: int = 1;

Ahora declaremos una cadena de texto:

var lenguaje = "Swift"

Aqu la declaracin en Swift queda muy limpia y se parece bastante a lo que sera,
por ejemplo, en JavaScript. Pero, cmo se hara en Objective-C?:

NSString*lenguaje=@"Swift";

Con Swift no hay necesidad de usar punteros de memoria (*) o de ponerle una @ de
prefijo al valor.
Las constantes en Swift se pueden declarar usando la palabra let :

let lenguaje = "swift"


O tambin:

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

14

let lenguaje: String = "Swift"

Como vemos, Swift permite tambin la inferencia de tipos al declarar constantes.


En Objective -C se hara as:

NSString*const lenguaje=@"Swift";

Arrays
En Swift los arrays y diccionarios se crean usando corchetes [] y se accede a sus
elementos escribiendo su posicin dentro de la matriz.

var arr = ["primero" , "segundo"]

En Objective-C:

NSArray *arr = @[@"primero", @"segundo];

En Swift puedes acceder a un elemento usando su nmero de posicin:

var primerElemento = arr[0]

Los mejores cursos online para programadores


campusMVP.es

15

Y aplicarle un valor as:

arr[0] = "Primer Elemento"

En Objective-C esa misma asignacin sera:

NSString *primerElemento = arr[0];

Que se ve un poco ms complicado.


Puedes enumerar un array en Swift utilizando un bucle for in :

for elmto in arr { // haz algo}

Mientras que en Objective-C ese mismo bucle sera:

for(NSString *elmto in arr){ // haz algo}

Para aadir otro elemento al array en Swift podemos utilizar simplemente el


operador += :

arr += ["tercero"]

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

16

o la funcin append:

arr.append("cuarto")

Bucles
Hasta ahora hemos visto cmo crear elementos. Ahora veamos cmo trabajar con
bucles a travs de ellos.

En primer lugar, veamos la sintaxis de un bucle for en Swift:

for var i = 0; i < 10; i++ {

//haz algo
}

Como cabra esperar, especificamos un valor y un incremento hasta que se cumple la


condicin.

En Objective-C es prcticamente idntico, solo que debemos especificar el tipo de las


variables:

for (int i = 0; i <= 10; i++){


//haz algo
}

Los mejores cursos online para programadores


campusMVP.es

17

Hasta aqu ambos lenguajes se parecen mucho, pero es que, adems con Swift
puedes usar la variante for in para obtener el mismo resultado:

for i in 1...10 {

//haz algo
}

Swift crea la variable i y automticamente le asigna un valor mientras itera sobre el


valor especificado 110 en un rango cerrado que incluye los nmeros entre el 1 y el
10.
Usando el array creado anteriormente podemos iterar sobre las ciudades de esta
manera:

for ciudad in arr { print(ciudad)}

Tanto Swift como Objective-C disponen de bucles while y repeat con sintaxis casi
idnticas variando solamente la declaracin de las variables como ya sabemos:

while n < 10 {
//haz algo
n++
}

Lo que est escrito despus de la declaracin while debe poder evaluarse a un valor
verdadero o falso, y el cdigo se ejecutar mientras esta condicin sea true . En el
ejemplo el bucle dar 10 vueltas ya que le sumamos 1 a la variable n al final de cada
vuelta.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

18

El loop repeat se comporta de la misma manera pero asegurndose de que el cdigo


se ejecuta al menos una vez antes de evaluar la condicin, ya que sta se comprueba
al final, tras haber ejecuta el cuerpo:

var n = 0

repeat {
//haz algo
n++
} while n<10

En este ejemplo nos aseguramos de que el valor de n se muestra antes de que se


incremente y sea evaluado por la declaracin while.

Condicionales
Mientras los bucles se encargan de tareas repetitivas, las sentencias if y switch se
encargan de controlar el flujo del programa, tomando decisiones en funcin de
ciertas condiciones.

if

La sintaxis de if es idntica a la de muchos otros lenguajes de programacin, tanto


en Swift como en Objective-C. Solo que en Swift la condicin puede ir entre
parntesis o no:

if ciudad == "MAD" {

print("Madrid")
}

sera vlido en Swift, pero tambin estara bien:

Los mejores cursos online para programadores


campusMVP.es

19

if (ciudad == "MAD") {
print("Madrid")
}

Que es vlido en los dos lenguajes. En Swift es opcional, as que elige la opcin que
prefieras, aunque por regla general los programadores experimentados suelen usar la
segunda opcin, ms coherente con la sintaxis de otros lenguajes.
Tras la condicin principal con if puede aparecer una opcin a ejecutar en caso de
que no se cumpla la condicin, usando o bien else if, que abre una nueva rama
condicional, o bien un simple else que abre solo la rama alternativa:

if ciudad == "MAD" {
print("Madrid")
} else if ciudad == "BCN" {
print("Barcelona")
} else {
print("Zaragoza")
}

Switch

Cuando tenemos muchas opciones diferentes, el uso de los condicionales con if se


puede hacer muy lioso y propenso a errores y a cdigo confuso. Para solucionarlo en
situaciones en las que lo que que necesitamos es comprobar varios posibles casos
para una situacin, se han creado las estructuras condicionales de tipo switch.
Estas estructuras lo que hacen es verificar casos, uno por uno, y ejecutar el cdigo
que corresponda para cada caso.
Por ejemplo, en Swift podramos escribir:

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

20

switch ciudad {
case "MAD":
print("Madrid")
case "BCN":
print("Barcelona")
default: print("Zaragoza")
}

En Objective-C es prcticamente idntico:

switch (valor) {
case 0:
print("Madrid");

break;
case 1:
print("Barcelona");
break;
default:
print("Zaragoza");
break;
}

Pero en este caso la condicin a comprobar va entre parntesis, y, adems, despus


de cada caso se debe detener la ejecucin de la estructura usando la instruccin
break o se seguiran ejecutando los casos siguientes aunque no se cumplan.

Los mejores cursos online para programadores


campusMVP.es

21

En Swift, sin embargo, no hace falta una sentencia break ya que no salta al siguiente
case de manera implcita. Esto significa que, una vez que un caso se evala como
true y se ejecuta, el siguiente caso no se evaluar.
Pero an as es necesario especificar una accin por defecto, para lo cual se usa la
palabra clave default en ambos casos. Esta rama ser la que se ejecutar si ninguna
de los casos anteriores coincide.
En Swift la sentencia case puede contener mltiples valores separados por comas o
espacios, y podemos usar NSString para la condicin, cosa que no es posible en
Objective-C (por eso en nuestro ejemplo hemos usado enteros, que son junto con los
valores enumerados, los nicos tipos admitidos por este lenguaje).

Funciones
Para declarar una funcin en Swift se usa la palabra clave func:

func miNombre() {
print("Juan")
}

Como en casi cualquier otro lenguaje, podemos pasarle parmetros dentro de los
parntesis especificando nombre y tipo de variable, separndolos por comas si hay
ms de uno:

func miNombre(nombre: String, apellido: String) {


print("\(nombre) \(apellido)")

Para declarar funciones que devuelvan resultados aadiremos un -> despus de los
parmetros, indicando a continuacin el tipo de dato que va a devolver.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

22

func crearNombre(nombre: String, apellido: String) -> String {


return "\(nombre) \(apellido)"
}

En el caso de Objective-C la sintaxis es ms parecida a la de los lenguajes


tradicionales. Primero se indica el tipo a devolver, luego el nombre de la funcin y
finalmente, entre parntesis, los parmetros de la misma indicando el tipo y a
continuacin el nombre, separndolos con comas si hay ms de uno:

NSString *crearNombre(NSString nombre, NSString apellido) {


return [NSString stringWithFormat:@"%@ %@", nombre,
apellidos];
}

que tiene una sintaxis mucho ms complicada dentro, pero que, en lo que es la
declaracin de la funcin, es ms o menos igual de sencillo.

Los mejores cursos online para programadores


campusMVP.es

23

Conceptos fundamentales de Swift


Por Eduard Toms
Tras haber repasado la sintaxis ms bsica de los dos lenguajes, ahora vamos a
centrarnos en algunos conceptos fundamentales del lenguaje Swift que conviene
conocer para poder trabajar con l. No se entrar en detalles de sintaxis, sino
solamente en comprender dichos conceptos de manera general.
Es importante tener presente que Swift es un lenguaje orientado a objetos,
aunque toma aspectos prestados de los lenguajes funcionales. En este punto se
asemeja mucho a C#, Java e incluso Objective-C.

Enumeraciones
Las enumeraciones son uno de los aadidos interesantes de Swift frente a ObjectiveC. Bsicamente una enumeracin (enum) permite declarar un conjunto de valores
bajo un nombre identificativo. Las enumeraciones de Swift pueden tener mtodos
asociados y conformar protocolos (ms sobre esto luego).
Se parecen mucho ms a las enumeraciones de Java o a las enum class de C++ 11
que a las enumeraciones clsicas de C++ o de C#.

Clases
Las clases constituyen uno de los pilares fundamentales de Swift. Al igual que
Objective-C, Swift posee herencia simple, es decir, una clase puede heredar tan solo
de otra clase, no de varias a la vez. Se pueden formar jerarquas de clases todo lo
complejas que sea necesario, pero donde cada clase tenga una sola clase base.

Nota: Swift admite el uso de funciones globales, es decir, funciones


definidas fuera de cualquier clase, lo que posibilita desarrollar en Swift
mediante un planteamiento ms orientado a procedimientos. Aunque las
funciones globales tienen sus usos lcitos, es preferible casi siempre usar
un planteamiento orientado a objetos.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

24

Referencias
Swift no tiene punteros, usa referencias en su lugar. Eso significa que no debemos
explicitar el tipo puntero para tener una variable que contenga un objeto.
As, si en Objective-C para declarar una variable que contenga un objeto de un tipo
MyClass, debemos declarar la variable como MyClass* (el asterisco significa puntero
a, por lo que MyClass* se lee como puntero a un objeto MyClass), en Swift basta
con declararla de tipo MyClass.
Esto hace que para el desarrollador el trabajo con objetos sea idntico al trabajo con
tipos simples: en Objective-C una variable de tipo int sola ser simplemente int y no
int* (aunque esta segunda es vlida en segn que contextos). Esto aade una
complejidad que en Swift desaparece.
Swift define el valor nil como "ausencia de valor". En Swift por defecto las
referencias son no nulables, es decir no pueden contener el valor nil. Para que una
referencia sea nulable (y por lo tanto contener el valor nil para indicar que no
contiene ningn objeto) debe declararse explcitamente como tal aadiendo ? al final
del tipo:

var foo : MyClass = MyClass()


// Correcto. Referencia NO nulable asignada a un objeto

var foo : MyClass? = nil


// Correcto. Referencia nulable asignada a nil

var foo : MyClass = nil

// Incorrecto: Referencia NO nulable asignada a nil

Para acceder al valor de una propiedad de una referencia debe usarse el


operador "." (punto) o bien el "?." (interrogante-punto) si la referencia es
nulable.

Los mejores cursos online para programadores


campusMVP.es

25

Si la clase MyClass tiene una propiedad name, para acceder a ella usaramos:

var x = f.name
// Si f es una referencia NO nulable(MyClass)

var x = f?.name

// Si f es una referencia nulable (MyClasss?)

El operador ?. es seguro porque si f vale nil, entonces f?.name no generar ningn


error, sino que devolver nil.

Para convertir una referencia nulable en una no nulable (y por lo tanto "extraer" el
objeto que contenga dicha referencia no nulable) se usa el operador ! (admiracin):

var x = f!

// Si f vale nil dar un error de ejecucin. En caso


contrario x apuntar al mismo objeto que f, pero x es no
nulable

var n = f!.name
// Si fa vale nil dar un error de ejecucin. En caso
contrario n ser el valor de la propiedad name del objeto
apuntado por f

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

26

Para ms informacin sobre las referencias nulables y no nulables en Swift puedes


leer un artculo ms adelante en este documento, titulado "Swift y los nulos".

Protocolos
Un protocolo es el equivalente en Swift a las interfaces de C# y Java. Es decir, un
protocolo define un conjunto de mtodos que luego una clase debe implementar.
Cuando una clase implementa los mtodos de un protocolo se dice que "conforma
dicho protocolo".
Un aspecto a tener presente de los protocolos es que stos pueden definir mtodos
opcionales, es decir, mtodos que pueden, aunque no tienen por qu, ser
implementados por las clases que conformen dichos protocolos.
Se pueden declarar referencias a protocolos y usar parmetros y valores de retorno
de tipo protocolo.

Genricos
Los genricos son una de las novedades ms destacadas de Swift respecto a
Objective-C.
Si conoces este concepto de C# o Java, o bien ests familiarizado con las templates
de C++ no te costar mucho entenderlo (aunque los genricos de Swift tienen
mucho ms parecidos con los de C# o Java que con las templates).
Se llama genricos a la posibilidad de pasar como un parmetro un tipo en lugar
de un valor. Los genricos permiten una mayor reutilizacin de cdigo al poder
reaprovechar un mismo cdigo (una clase o un mtodo) para que trabaje con varios
tipos de datos distintos.

Inferencia de tipos
Swift es un lenguaje con tipado esttico, es decir, las variables tienen un tipo
establecido en tiempo de compilacin, al contrario que en otros lenguajes dinmicos
como JavaScript por ejemplo, donde una variable puede contener un valor de un
determinado tipo y al instante siguiente albergar datos de un tipo completamente
distinto.

Los mejores cursos online para programadores


campusMVP.es

27

En Swift, si al declarar una variable le asignamos un valor inicial, el compilador puede


inferir el tipo de la variable y no es necesario que lo indiquemos nosotros, como ya
hemos visto anteriormente.
As en Swift se puede hacer:

var message = "Hello world!"

Y el compilador asignar el tipo String a la variable message. Simplemente porque la


expresin asignada ("Hello world!") es de tipo String.
Si queremos, podemos establecer el tipo de la variable pero es algo opcional:

var message : String = "Hello world!"

Ahora bien, la inferencia de tipos requiere que la variable se asigne a una


expresin al declararse y no solo eso, requiere tambin que el compilador pueda
determinar el tipo de la expresin asignada.
Es por ello que el siguiente cdigo no compila:

var message

// Error: no se asigna expresin alguna a message por lo que


el compilador no puede deducir el tipo

var message = nil

// Error: nil no tiene ningn tipo en concreto

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

28

En estos casos debemos especificar el tipo de la variable:

var message : String


var message : MyClass

Nota: Recuerda que la inferencia de tipos no convierte al lenguaje en


dinmico, ni mucho menos. Una vez una variable tiene un tipo
(explicitado por el desarrollador o inferido) lo mantiene para siempre y
solo puede contener valores de este tipo..

Los mejores cursos online para programadores


campusMVP.es

29

9 ideas interesantes de Swift sacadas de otros


lenguajes
por Eduard Toms

El objetivo de este captulo es recopilar ideas interesantes que incorpora el lenguaje


de desarrollo de Apple y que han sido sacadas de otros lenguajes ms o menos
populares.
Que una idea est sacada de otro lenguaje es lo normal: hoy en da los nuevos
lenguajes se crean a partir de los existentes mezclando conceptos de cada uno de
ellos, en base a la orientacin y a la filosofa con la que se quiera dotar el lenguaje.
Tmate esta lista de ideas como un ejemplo: no estn todas las ideas de Swift.
Simplemente hemos elegido nueve de ellas que nos han parecido interesantes y las
mostramos aqu. Empecemos, pues!

1. Operador de rango
El operador de rango (...) permite definir directamente un rango de valores. Los
rangos son un tipo de datos vlido por lo que pueden ser asignados a variables:

var range = 1...10

Los rangos pueden iterarse:

for value in range { }

Y por supuesto el operador de rango no est limitado a constantes:

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

30

var from = 2
var to = 12
var range = from...to

Esta caracterstica se encuentra en lenguajes como Python

2. Punto y coma no (pero bueno, si lo pones no pasa nada)


Swift elimina la necesidad de usar el punto y coma para separar sentencias que estn
en lneas separadas, pero si lo usas no genera ningn error. As ambas lneas de
cdigo son vlidas:

var start = 10
var start = 10;

Eso s, el punto y coma sigue siendo obligatorio para separar sentencias en una
misma lnea:

var from =10; var to=20


// El ; despus del 10 es obligatorio. Despus del 20 puede
venir o no (al ser la ltima sentencia de la lnea).

var from =10; var to=20

// El ; despus del 10 es obligatorio. Despus del 20 puede


venir o no (al ser la ltima sentencia de la lnea).

Los mejores cursos online para programadores


campusMVP.es

31

Esta caracterstica se encuentra, aunque con ciertas diferencias, en JavaScript.

3. Tuplas
Las tuplas se incorporan como tipo nativo del lenguaje:

var tuple = (1,2,3)


var first = tuple.0 // first valdr 1

Las tuplas se pueden pasar como parmetros o ser devueltos por una funcin:

func getTuple() -> (Int, Int, Int) {


return (1,2,3)
}
var tuple = getTuple()
println (tuple.0)

Las tuplas pueden tener parmetros nombrados lo que reduce mucho la necesidad
de crear clases que se usan una sola vez:

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

32

func getFullName() -> (name: String, lastName: String) {


return ("Super", "Lopez")
}
var tuple = getFullName()
println (tuple.name) // tuple.0 sigue funcionando

Esta caracterstica se encuentra en Pyhton o Scala. Casi cualquier lenguaje tiene


soporte para tuplas, pero no todos lo tienen integrado como un tipo "nativo" del
lenguaje.

4. Enumeraciones
Muchos lenguajes soportan enumeraciones, pero pocos las tienen tan potentes como
las de Swift. As las enumeraciones pueden tener mtodos e implementar
interfaces (protocolos en la jerga de Swift). La declaracin de enumeraciones es muy
sencilla:

enum Features {

case Basic, Advanced


}

A diferencia de muchos lenguajes (tales como C C#) las enumeraciones no tienen


una correspondencia con un valor entero.
Por ejemplo, pueden implementar un protocolo (equivalente a una interfaz en otros
lenguajes):

Los mejores cursos online para programadores


campusMVP.es

33

// Define un protocolo (interfaz) con un mtodo


protocol DescProtocol {
func Description () -> String
}

enum Features : DescProtocol {


case Basic, Advanced
func Description() -> String {

switch (self) {
case .Basic:
return "Basic features only"
case .Advanced:

return "Advanced features on"


}
}
}

// Declaramos una variable de tipo Features


var features = Features.Advanced
println(features.Description())

// Declaramos una variable de tipo DescProtocol


var descriptable : DescProtocol = Features.Basic

println(descriptable.Description())

Esta capacidad de las enumeraciones de tener mtodos se puede encontrar en Java.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

34

5. Sobrecarga de operadores
La sobrecarga de operadores es la posibilidad de utilizar los operadores del lenguaje
para nuestros tipos. As en Swift es posible tener, por ejemplo, una clase Complex y
definir el operador de suma (+) sobre elementos de dicha clase.
Supongamos la siguiente clase Complex:

class Complex {
var real : Double = 0.0
var imaginary : Double = 0.0
init() {}
init(r:Double, i:Double) {
self.real = r
self.imaginary = i
}
}

Podemos definir el operador de suma para permitir sumar nmeros complejos:

@infix func + (left: Complex, right:Complex)-> Complex {


var ret = Complex()

ret.real = left.real + right.real


ret.imaginary = left.imaginary + right.imaginary
return ret
}

Los mejores cursos online para programadores


campusMVP.es

35

Es importante sealar que el operador est definido en el mbito global, es decir


no es un mtodo de la clase Complex. Swift no permite que los operadores estn
definidos como miembros de una clase, deben estar siempre definidos en el mbito
global.
Una vez tenemos el operador de suma definido ya podemos usar algo parecido a:

var cidentity = Complex(r:0,i:1)


var other = Complex(r:10,i:1)

var add = cidentity + other

Esto permite una sintaxis mucho ms natural que si no tuvisemos sobrecarga de


operadores (donde entonces, para poder sumar nmeros complejos deberamos usar
algn mtodo llamado Add o similar). A cambio se puede perder en claridad: cuando
vemos una expresin a+b tenemos que saber cules son los tipos de a y b para
deducir exactamente qu hace dicha expresin.
La sobrecarga de operadores se encuentra en otros lenguajes como C++ o C#, cada
uno con sus propias peculiaridades.
Ahora bien, Swift permite crearnos nuestros propios operadores ms all de los
que define el propio lenguaje. Para ello primero debemos declarar el operador
usando operator:

operator infix +- {}

Con eso reservamos este token (+-) para poder ser usado como operador "infijo" (es
decir "en medio de dos") para cualquier tipo en el que est definido (recuerda, eso s,
que se definen siempre como funciones globales).
Una vez el operador est reservado podemos definirlo:

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

36

@infix func +- (left:Int, right:Int) -> Range<Int> {


return (left-right)..(left+right)
}

En este caso el operador va en medio de dos nmeros enteros y devuelve un Double.


Ahora podemos pues hacer algo como:

var values = 5+-2

Y values ser un rango que comprender los valores desde el 3 hasta el 7 (ambos
inclusive).

6. Genricos
Genricos es la posibilidad de definir un parmetro que no toma un valor sino un
tipo. Es una caracterstica que se puede encontrar en Java y en C#. Por su parte C++
tiene algo que conceptualmente es parecido (templates) pero que es mucho ms
potente (y complejo) que los genricos. Swift se alinea ms con Java y C#:

class Stack<T> {
var items = T[]()
func push(item: T) {

items.append(item)
}
func pop() -> T {
return items.removeLast()

}
}

Los mejores cursos online para programadores


campusMVP.es

37

La clase Stack puede contener cualquier tipo de datos, as podemos tener una pila de
cadenas:

var stackOfStrings = Stack<String>()

En stackOfStrings el mtodo push acepta un parmetro de tipo String y del mismo


modo pop devuelve un objeto String, ya que el parmetro genrico T vale String . Al
igual que Java o C# el compilador no nos dejar llamar a ningn mtodo sobre
un objeto de tipo T (ya que no sabe qu es). Para indicarle al compilador que el
parmetro T solo puede tomar determinados valores (tipos) podemos usar una (o
varias) constraints sobre T:

class Stack<T : XX>

En este caso el parmetro genrico T tan solo puede tomar un valor de un tipo que
derive de XX o conforme el protocolo XX (dependiendo de si XX es el nombre de una
clase o de un protocolo).

7. Tipado esttico... y dinmico


Esa caracterstica era obligatoria en Swift teniendo en cuenta que Swift interacciona
con Cocoa y con el runtime de Objective-C, que tiene muchas partes dinmicas. As
pues Swift es un lenguaje con tipado esttico (cada variable tiene un tipo definido en
tiempo de compilacin), pero existe el tipo AnyObject que deshabilita las
comprobaciones del compilador:

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

38

var myObject : AnyObject = NSDate()


let futureDate = myObject.dateByAddingTimeInterval(10)

La variable myObject est definida como AnyObject y puede contener cualquier


objeto. Adems podemos llamar propiedades y mtodos de dicho objeto (el
compilador no verificar que dicho mtodo exista ya que no sabe de que tipo real es
el objeto). Eso s, si el mtodo no existe en ejecucin se generar un error. ObjectiveC tiene, por supuesto, una caracterstica similar (el tipo de datos id) y en C# se puede
encontrar tambin algo parecido (a travs de la palabra dynamic).

Un tema a tener en cuenta es que, si queremos realizar llamadas a mtodos a travs


de una variable AnyObject, el objeto asignado debe ser de una clase que conforme
el protocolo NSObject. Lo ms sencillo es heredar de NSObject. En caso contrario
recibiremos un error:

El error desaparece si la clase Foo hereda de NSObject.

8. Extensiones
Las extensiones permiten aadir mtodos y propiedades a una clase ya existente
sin necesidad de modificar el cdigo fuente de dicha clase:

Los mejores cursos online para programadores


campusMVP.es

39

class Foo {
var value = 0
func inc() {
self.value++

}
}
extension Foo {
func dec() {

self.value-}
}
var foo = Foo()
foo.inc()
foo.dec()

En este caso la extensin define un mtodo adicional (dec) que luego podemos
llamar como si fuese un mtodo propio de la clase. Dentro de los mtodos de una
extensin podemos usar self para referirnos al objeto extendido (al igual que en los
mtodos propios de la clase).

Objective-C tiene una caracterstica similar y C# tambin ofrece algo parecido a


travs de los mtodos de extensin, aunque en C# no pueden aadirse propiedades
(slo mtodos). A cambio en C# pueden aadirse mtodos de extensin a una
interfaz mientras que Swift no permite extender un protocolo.

9. Paso por referencia


En Swift los objetos se pasan por referencia (a no ser que sean structs que entonces
se pasa una copia). As el siguiente cdigo imprime 20:

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

40

class Wrapper {
var value = 0
}
func updateWrapper (wrapperToUpdate: Wrapper) {

wrapperToUpdate.value = wrapperToUpdate.value + 10
}
var intValue = Wrapper()
intValue.value = 10
updateWrapper(intValue)
println(intValue.value)

La razn es que el objeto Wrapper contenido en la variable intValue se pasa por


referencia a la funcin updateWrapper, por lo que el parmetro wrapperToUpdate
apunta al mismo objeto. Por eso al incrementar en 10 el valor de value dentro de la
funcin se incrementa el valor de la propiedad value en intValue (puesto que
ambas referencias apuntan al mismo objeto). Cualquier lenguaje con soporte para
clases soporta el paso por referencia ya que es mucho ms eficiente que el paso por
valor (copiar el objeto). En C# y Java los objetos siempre se pasan por referencia. En
C++ depende de si usamos punteros (o referencias) o no.

Pero... qu ocurre si dentro de la funcin updateWrapper modificamos el valor de


dicho parmetro (es decir, asignamos el parmetro a un objeto nuevo)?

func updateWrapper (wrapperToUpdate: Wrapper) {


wrapperToUpdate = Wrapper()
wrapperToUpdate.value = 1000

Los mejores cursos online para programadores


campusMVP.es

41

Pues que Swift nos da un error:

Eso es debido a que la referencia se pasa por valor (es decir se copia la referencia,
no su contenido que quede claro). Por norma general asignar una referencia
recibida como parmetro a un nuevo objeto no suele ser necesario, pero en segn
que casos puede ser interesante. Para esos casos Swift soporta pasar una referencia
por referencia utilizando la palabra clave inout:

func updateWrapper (inout wrapperToUpdate: Wrapper) {


wrapperToUpdate = Wrapper()
wrapperToUpdate.value = 1000
}

Eso s, cuando declaramos un parmetro como inout, debemos usar el operador de


referenciacin (&) al pasar dicho parmetro. As el siguiente cdigo imprimir 1000,
ya que la referencia intValue es pasada a su vez por referencia y por lo tanto toma
el valor del objeto creado dentro de updateWrapper:

var intValue = Wrapper()


intValue.value = 10
updateWrapper(&intValue)

println(intValue.value)

Lenguajes como Objective-C y C++ proporcionan un mecanismo similar (a travs de


los punteros a puntero) al igual que C# (usando los parmetros ref o out). Java no
proporciona ningn mecanismo para pasar una referencia por referencia.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

42

Swift y los nulos


Por Eduard Toms
La gestin de las referencias (o punteros) nulas es uno de los problemas clsicos
cuando se desarrolla con un lenguaje orientado a objetos. Acceder a una referencia
nula genera un error de ejecucin que adems tiene difcil tratamiento.
Incluso aunque el lenguaje te permita capturar dicho error (como Java o C#) la
verdad es que uno, como desarrollador, poco puede hacer ante l: si se intenta
acceder a un objeto pero resulta que no existe dicho objeto poca cosa puede
hacerse.
La mayora de los desarrolladores asumen que las referencias pueden ser nulas y lo
ven como algo normal. Pero realmente es una mala idea. No hay motivo alguno por
el cual todas las referencias deban poder ser nulas (es decir, no apuntar a ningn
objeto). El nico motivo real es que la mayora de los lenguajes admiten dicha
posibilidad.
En Swift las cosas son ligeramente distintas, y si vienes de Objective-C, C++, C# o
Java entre otros, te puedes llevar ms de una sorpresa. Por defecto en Swift las
referencias no toman el valor nil (el valor nil representa una referencia nula). Si
por ejemplo definimos la siguiente clase:

class Ufo {
init() {}
var name

= ""

Podemos declarar una referencia que contenga un objeto de tipo Ufo de la siguiente
manera:

var u =

Ufo()

Los mejores cursos online para programadores


campusMVP.es

43

Pero si luego intentamos asignar el valor nil a dicha referencia se obtendr un error
(Type does not conform to protocol NilLiteralConvertible).

Podemos declarar la variable sin inicializarla, pero Swift nos obligar a asignarle un
valor antes de poder usarla. Supongamos una funcin UfoName que devuelva el
nombre de un objeto Ufo:

func UfoName (u:Ufo) -> String {


return u.name
}

El siguiente cdigo da el error "Variable u used before being initialized":

var u:Ufo
UfoName(u)

Referencias opcionales
Por supuesto a veces nos interesa que una referencia pueda tener el valor de nil.
Para ello, Swift nos ofrece las referencias opcionales:

var optionalUfo : Ufo?

Ahora optionalUfo es una referencia de tipo Ufo? El interrogante final significa


"opcional" por lo que dicha referencia puede tomar cualquier objeto Ufo como valor

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

44

o el valor nil. De hecho, esta referencia se inicializa, por defecto, a nil. Si ahora
llamamos a la funcin UfoName pasndole la referencia optionalUfo (cuyo valor es
nil) obtendremos un error (Value of optional type not unwrapped):

Este error es debido a que UfoName espera una referencia de tipo Ufo y no una de
tipo Ufo? Para "extraer" el valor Ufo que hay dentro de una referencia Ufo? debemos
usar el operador postfijo !

UfoName(optionalUfo!)

Por supuesto si la referencia opcional vale nil como es el caso, la funcin llamada
(en este caso UfoName) recibir un nil incluso aunque ella declaraba que esperaba
una referencia de tipo Ufo (que a priori no puede tener el valor nil).
En este caso nos encontraremos intentando acceder a una referencia nula:

As pues, es nuestra responsabilidad que al llamar al operador ! nos aseguremos de


que la referencia opcional contiene realmente un valor.

Pero Swift nos ofrece todava ms herramientas para ayudarnos a lidiar con posibles
referencias nulas. El operador ? es otra de ellas. Dicho operador nos permite acceder
al valor de una propiedad opcional solo si dicha referencia contiene un objeto. En
caso contrario devolver nil. Solo podemos usar este operador en referencias
opcionales.
As pues podramos reescribir la funcin UfoName como sigue:

Los mejores cursos online para programadores


campusMVP.es

45

func UfoName (u:Ufo?) -> String? {

return u?.name
}

Podemos observar que ahora declaramos que la funcin acepta una referencia
opcional a Ufo y devuelve una referencia opcional a String (es decir puede devolver
nil). Ahora ese cdigo es vlido y no produce error alguno:

var optionalUfo : Ufo?


UfoName(optionalUfo)

A pesar de que el valor de optionalUfo es nil, no se genera ningn error porque se


usa el operador ? para acceder al valor de la propiedad name en la funcin UfoName .
Por supuesto a pesar de que la funcin UfoName ahora acepta una referencia
opcional a Ufo le puedo pasar una referencia a Ufo:

var u = Ufo()
u.name = "Zynga"

UfoName(u)

En este caso UfoName devolvera la cadena "Zynga". Es decir, las referencias no


opcionales se convierten automticamente a referencias opcionales. Lo contrario no
es cierto.

Protocolo NilLiteralConvertible
Si una clase implementa dicho protocolo puedes definir cmo se inicializa una
referencia no opcional de dicha clase cuando se le asigna el valor nil. Es decir,
eso viene a ser como "redefinir el valor de nil".
facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

46

As, si tenemos el siguiente cdigo:

class Ufo : NilLiteralConvertible {


required init() {
}
var name

= ""

class func convertFromNilLiteral() -> Self {


var u =

self()

u.name = "From nil"


return u
}
}

func UfoName (u:Ufo) -> String {


return u.name
}

La clase Ufo conforma el protocolo NilLiteralConvertible. As si definimos una


variable Ufo, la inicializamos a nil y llamamos a la funcin UfoName podremos
observar que el valor devuelto es "From nil".

var u : Ufo = nil


UfoName(u)

// Devuelve "From nil"

Vemos pues que, aunque tenemos una referencia que no es opcional, le podemos
asignar el valor nil debido a que la clase conforma el protocolo
NilLiteralConvertible.

Los mejores cursos online para programadores


campusMVP.es

47

Pero debemos tener presente que a pesar de que le asignamos nil, la referencia
termina obteniendo un objeto (el objeto devuelto por el mtodo
convertFromNilLiteral).
Por supuesto si usamos una referencia opcional, entonces nil adquiere su
significado original:

var u : Ufo? = nil

En este caso el valor de u es realmente nil.

Espero que esto te ayude a comprender un poco ms cmo funcionan las referencias
y los valores nulos en Swift.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

48

Estructura de una aplicacin iOS


Por Eduard Toms
Vamos a ver ahora cul es la estructura de una aplicacin bsica para iOS. Para el
desarrollo de aplicaciones nativas de iOS se usa el framework Cocoa Touch, un
framework ideado por Apple para crear aplicaciones para este sistema operativo.

Cocoa Touch es una adaptacin de Cocoa (framework que se usa para el desarrollo
de aplicaciones MacOSX) para interfaces tctiles.

Nota: es posible desarrollar aplicaciones nativas para iOS mezclando C++

y Objective-C: toda la interaccin con Cocoa Touch debe realizarse


utilizando Objective-C pero el resto del cdigo es posible desarrollarlo en
C++. XCode, el entorno de desarrollo integrado gratuito de Apple,
permite mezclar ambos lenguajes en un mismo proyecto.

Los mejores cursos online para programadores


campusMVP.es

49

Las clases en Cocoa Touch estn organizadas en varios grupos que se diferencian por
su prefijo (dos letras maysculas al principio de la clase). Los prefijos ms comunes
son:
NS: Para las clases que forman parte del Foundation Kit, que contiene todas
aquellas clases de uso comn y las clases base ms importantes. P. ej. la clase
base de todas las clases se llama NSObject. Por ejemplo, un par de clases que
tienen este prefijo son NSString y NSDictionary.
UI: Para las clases que forman parte del UIKit, que contiene todas aquellas
clases para crear interfaces grficas de usuario.

Nota: Cocoa Touch est desarrollado en Objective-C y este lenguaje no


tiene namespaces ni ningn mecanismo para evitar colisiones de

nombres. Es por ello que se suele usar siempre un prefijo que se aade al
nombre de las clases. Los prefijos de dos letras maysculas estn
reservados para Apple y no debes usarlos al definir tus clases.

El modelo de desarrollo para iOS se basa en el patrn MVC (Modelo - Vista Controlador). Como suele ocurrir en estos casos, no hay una definicin formal de lo
que es la M (se trata del modelo, los datos de tu aplicacin) pero tanto la V como la C
s que estn claramente delimitados.

Lenguaje Swift
Como sabemos, Swift viene a ser el "lavado de cara" que se debera efectuar a
Objective-C pero, que por razones de compatibilidad no es posible realizar. A pesar
de que Apple ha ido modernizando y remodelando Objective-C con el paso del
tiempo, el propio origen del lenguaje y su filosofa hacen que llegados a cierto punto
sea muy difcil seguir modernizndolo: su mezcla de sintaxis (y conceptos) entre C y
Smalltalk, el uso de punteros y el modelo de gestin de memoria, hacen que
Objective-C sea un lenguaje poco amigable. Swift viene a solucionar todo eso.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

50

Pero Swift mantiene una compatibilidad casi total con las APIs existentes. Al
desarrollar en Swift no se desarrollar contra una nueva versin de Cocoa Touch sino
que Swift define los "enlaces" (bindings) que tiene con Objective-C, es decir: es
posible llamar a cualquier API desarrollada en Objective-C usando Swift. Existen un
conjunto de conversiones y convenciones que deben tenerse en cuenta y poco ms.
De hecho es posible mezclar Objective-C y Swift dentro del mismo proyecto, con
lo que viejo cdigo Objective-C que exista puede reaprovecharse en proyectos
nuevos hechos con Swift.

Recuerda: las APIs que se usan para desarrollar en Swift son las mismas que se
usan para hacerlo con Objective-C. Solo hay que tener presente algunas
convenciones.

Vistas
Una vista en iOS contiene el aspecto grfico. Por aspecto grfico nos estamos
refiriendo a los controles (botones, textos, etc.), a su disposicin y a sus atributos de
presentacin (colores, fuentes, etc.).
Una cuestin importante relativa a las vistas es que todo en iOS es una vista. No
solo las pantallas de tu aplicacin, sino tambin los controles que tengas en ella. Un
botn es una vista, al igual que tu pantalla o que el contenido que muestres en
una fila de una tabla. Todos esos elementos terminan derivando al final de UIView
que es la clase base para todas las vistas.
Para definir las vistas de tu aplicacin se usa un storyboard que contiene no solo
las vistas de tu aplicacin sino tambin las transiciones (o navegaciones) entre ellas.
Por supuesto el IDE de Apple, XCode, ofrece un editor de vistas y de storyboards
completamente grfico.

Storyboards
Como se ha comentado los storyboards definen que vistas hay en tu aplicacin,
pero tambin las transiciones entre ellas.
Las vistas se denominan Escenas (Scenes) y las transiciones Segues.
Mediante el editor grfico integrado en XCode podrs aadir vistas al storyboard y
crear transiciones nuevas entre esas vistas.

Los mejores cursos online para programadores


campusMVP.es

51

Una ventaja de los storyboards es que al gestionar las transiciones de forma grfica se
pueden escribir prototipos de aplicaciones con muy poco cdigo.

Controladores (View Controllers)


Las vistas por s solas no tienen funcionalidad. Se limitan a mostrar unos controles en
pantalla, pero todo el mundo espera que cuando se pulse un botn ocurra algo. Para
aadir funcionalidad a una vista es necesario asociarla a un controlador.
El controlador (comnmente se le llama view controller) es el que dota de
funcionalidad a la vista.
Por norma general suele haber una relacin 1:1 entre vistas y controladores (cada
vista tiene una funcionalidad especfica, as que tendr un controlador especfico para
ella). Los controladores son clases que derivan, directa o indirectamente, de
UIViewController.
Desde XCode puedes indicar a cada vista cul es su controlador. Una vez una
vista tenga asociada un controlador puedes crear outlets y actions que te permitirn
especificar qu ocurre cuando el usuario interacciona con los controles de la vista.

Outlets y Actions
Cuando el usuario interacciona con tu aplicacin y hace algo como pulsar un botn,
se genera un evento que debe ser capturado en el controlador. Se denomina action
al mtodo del controlador que captura un evento lanzado por la vista (o
cualquier control o "subvista" que est en su interior). As, si el usuario hace clic en un
botn habr una action en el controlador que se encargar de ejecutar algo cuando
suceda este clic.
El controlador por norma general requiere tener acceso a los elementos (llmalos
controles o "subvistas" si quieres) que estn dentro de la vista. Por ejemplo, si un
controlador debe modificar el texto mostrado por una etiqueta, debe poder acceder
a dicha etiqueta para poder modificar sus propiedades. Esto se realiza a travs de un
Outlet. As pues, un controlador suele ser una combinacin de actions que se
encargan de gestionar los eventos e interaccionan con los otros controles de la vista
a travs de los outlets.

Nota: A nivel de cdigo una action es un mtodo (con una firma


especfica) mientras que un outlet es una propiedad del controlador.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

52

Delegado de aplicacin (Application delegate)


Tener vistas y controladores est muy bien pero es necesario alguien que coordine
todo esto a nivel global.
Por ejemplo, cul es la vista inicial que se va a ejecutar? Qu ocurre si llega un
evento que debe ser procesado de forma global (p. ej. iOS nos avisa de que nuestra
aplicacin va a pasar a background)?
Para gestionar estos temas globales existe el delegado de aplicacin. ste est
presente en todas las aplicaciones iOS (y tan solo hay uno por aplicacin). Se trata
de una clase que conforma el protocolo UIApplicationDelegate.

Nota: Los protocolos vienen a ser lo mismo que las interfaces en

lenguajes como C# o Java. La nica diferencia destacable es que se


permite que un protocolo declare mtodos opcionales que no tienen por
qu ser implementados por la clase que conforma el protocolo
(conformar el protocolo es lo mismo que implementar la interfaz).

Los mejores cursos online para programadores


campusMVP.es

53

El ciclo de vida de una aplicacin iOS


Por Eduard Toms
Antes de empezar a desarrollar una aplicacin para iOS debemos conocer cuatro
aspectos bsicos sobre el ciclo de vida de una aplicacin para este sistema operativo.
No se trata de entrar ahora a fondo en este ciclo de vida, ni de cmo se implementa
en cdigo, pero s de que conozcas los conceptos fundamentales.

Estados de una aplicacin


Una aplicacin de iOS puede estar en cualquiera de los siguientes estados:
Not running: La aplicacin no se est ejecutando. O bien no ha sido ejecutada
nunca, o bien el usuario la ejecut y luego la cerr (o la cerr el sistema
operativo).
Foreground: La aplicacin se est ejecutando y se est mostrando en pantalla.
iOS solo permite generalmente que una aplicacin se muestre a la vez en

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

54

pantalla as que solo habr una aplicacin en el estado de foreground cada vez.
El estado foreground se divide en dos sub-estados:
Active: La aplicacin se est mostrando y est recibiendo los eventos del
sistema operativo. Es decir, el usuario est interaccionando con la aplicacin.
Not active: La aplicacin se est mostrando pero no est recibiendo los
eventos del sistema operativo. Esto puede ocurrir cuando entra una llamada
telefnica o bien se activa la pantalla de bloqueo.
Background: Una aplicacin pasa a estar en el estado de background cuando
deja de ser la aplicacin que est en foreground, es decir, cuando el usuario
cambia a otra aplicacin. Eso no significa que la aplicacin deje de ejecutarse
(y pase a not running). Si la aplicacin tiene permisos para ejecutarse en
segundo plano podr seguir ejecutando cdigo aunque no sea la aplicacin
que el usuario est viendo.
Suspended: Una aplicacin pasa a este estado cuando est en background y
no ejecuta ningn cdigo. Se mantiene la memoria RAM de esta aplicacin,
pero no obtiene ningn ciclo de CPU. Es decir, la aplicacin est suspendida
pero no muerta. Una aplicacin en este estado puede ser terminada en
cualquier momento por el sistema operativo, as que antes de entrar en este
estado debemos guardar todos los datos necesarios por si acaso iOS decide
matar nuestra aplicacin (lo que ocurre cuando requiere liberar memoria
RAM).
Por supuesto iOS informar a tu aplicacin de cualquier cambio de estado y tu
cdigo deber responder adecuadamente. Por norma general iOS no es muy gentil:
cualquier cosa que hagas mal suele terminar con que el sistema operativo cierra
tu aplicacin sin contemplaciones.

Los mejores cursos online para programadores


campusMVP.es

55

Y ahora qu?
Enhorabuena! Has llegado al final del eBook. Esperamos que estos artculos te hayan
aclarado un poco qu te vas a encontrar si decides adentrarte a crear apps para iOS, te
resulten tiles y los pongas en prctica.

Los pasos clave para aprender a desarrollar para iOS


1- Psale este PDF a 3 amigos (o, an mejor, diles dnde descargarlo)
2- Practica mucho. No se aprende slo leyendo o viendo videotutoriales.
3- Si ests empezando con Swift y Objective-C o simplemente crees que
necesitas una base ms slida para sacarles partido Y si adems te gustara
que un experto te llevase de la mano, resolviendo tus dudas para as
avanzar ms rpido, tenemos algo para ti: Nuestro curso online de
desarrollo para iOS con Swift y Objective-C. Un curso creado por Eduard
Toms, que ser tu tutor y es quien ha escrito la mayora de los artculos
de esta gua.

facebook.com/campusMVP

twitter.com/campusMVP

youtube.com/campusMVPes

56

Por qu aprender con nosotros?


Porque en campusMVP creamos cursos online de calidad
contrastada cuyos autores y tutores son reconocidos expertos del
sector. Ver todo el catlogo de cursos

Quieres ms razones? Haz clic aqu

Y no te olvides de nuestro blog


En http://campusmvp.es/recursos encontrars ms eBooks gratuitos como este y otros
interesantsimos recursos y noticias del mundo del desarrollo. No dejes de visitarnos!

Los mejores cursos online para programadores


campusMVP.es

57