Introducción a Swift, el nuevo lenguaje de programación de iOS y OS X
Clase 2 de 16 • Curso de Desarrollo para iOS con Swift 2014
Este tutorial de Swift, el nuevo lenguaje de programación de Apple para iOS y OS X, te dará la introducción básica a programar apps nativas móviles para iPhone, iPad y Macs.
Swift es un "reemplazo" a Objective-C. Un lenguaje poderoso, pero intimidante para muchos programadores novatos. Con Swift podrás crear apps para iOS y Mac OS X.
Swift será enseñado a fondo en el Curso de programación para iPhone, iPad y iOS de Mejorando.la.
Variables
Declarar una variable funciona muy similar a Actionscript
Código :
<pre class="prettyprint">var freddier = 2501 otra = "ola ke ase"</pre>No hay necesidad de punto y coma. El "var" también es opcional. El tipo de variable queda fijo una vez la declaras, igual que en Python. Aunque se puede ser específico
Código :
<pre class="prettyprint">var freddier: Double = 100, cvander: Int = 50</pre>Y con la coma puedes declarar varias variables al tiempo.
Las constantes se declaran con let
Código :
<pre class="prettyprint">let cvander = "@cvander"</pre>Y sólo pueden ser asignadas una vez, por eso son constantes. Aunque la asignación puede ser en tiempo de ejecución.
Las conversiones de tipo de variable funcionan muy similar a Python
Código :
<pre class="prettyprint">var mensaje = "Freddie mide " var altura = 1.7 var tweet = mensaje + String(altura)</pre>Pero una forma más fácil de hacer conversión es usando paréntesis y backslash:
Código :
<pre class="prettyprint"> var tweet = "Freddie mide \(altura)"</pre>Se ve feo, pero seguro que con la práctica le tomarás amor.
Los arrays y diccionarios se crean con []
Código :
<pre class="prettyprint"> var cursos = ["marketing", "diseño", "programación"] println(cursos[1]) //diseño</pre>Y los diccionarios tipo JSON funcionan igual:
Código :
<pre class="prettyprint"> var fundadores = [ "Freddie": "@freddier", "Christian": "@cvander", ] println(fundadores["Freddie"]) //@freddier</pre>Observa que puedes dejar la coma al final y nada malo pasa. No como el odioso Javascript cuando cometes ese error en JSON.
Arrancar un Array vacío es bien raro
Código :
<pre class="prettyprint"> //Una matriz vacía de strings var matriz = String[]() //Un diccionario de strings y números, como JSON var json = Dictionary<string, float="">()</string,></pre>Condiciones
El if no necesita paréntesis
Código :
<pre class="prettyprint"> if dinero_mensual > 29 { cursos_mejorandola += 1 } else { mejor_empleo = 0 }</pre>Pero la comparación debe ser booleana. No puedes comparar cero con falso. Aquí la cosa se pone complicada. Existen tipos de datos "opcionales" para ser usados en comparaciones. Con el signo ? puedes decir que una variable puede ser de datos o vacía, con "nil". Ese es el null de Swift.
Código :
<pre class="prettyprint"> var que_carajo: String? = "WTF" que_carajo = nil if let contenido = que_carajo { //no es nil } else { //es nil }</pre>Yo también estoy confundido.
Swift trae switch, la peor estructura de control de la programación. Con una sintaxis aún más oscura.
Código :
<pre class="prettyprint"> var pago = "mensual" switch(pago) { case "mensual": var cursos = "todos" var duracion = 30 case "anual": var cursos = "todos" var duracion = 365 case "individual", "anual": var cursos = "marketing y todos" var duracion = 90 default: var que_carajo = "wtf" }</pre>Odio switch. Lo odio.
Ciclos
El amigable for-in existe para iterar entre arrays u objetos
Código :
<pre class="prettyprint"> let numerosRaros = [ "Primos": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Cuadrado": [1, 4, 9, 16, 25], ] var masGrande = 0 for (tipo, numeros) in numerosRaros { for numero in numeros { if numero > masGrande { masGrande = numero } } } println(masGrande)</pre>Y Apple hace mucho enfasis en usar "let" en valores fijos y "var" sólo para variables. #justRamThings
Por supuesto, el while también existe, con condiciones similares al if.
Código :
<pre class="prettyprint"> var n = 2 while n < 100 { n = n * 2 } println(n) var m = 2 do { m = m * 2 } while m < 100 println(m)</pre>¿Y recuerdas declarar una variable iteradora en un ciclo definido? Swift lo hace muy elegante
Código :
<pre class="prettyprint">var cuentaHastaDiez = 0 var acumula = 0 for i in 0..10 { cuentaHastaDiez += 1 acumula += i }</pre>O con condiciones
Código :
<pre class="prettyprint"> var tresCiclos = 0 for var i = 0; i < 3; ++i { tresCiclos += 1 }</pre>Funciones
Se declaran con func, pueden tener parametros y se les asigna un valor con -> en frente de los parametros. ¿Estamos seguros que no es Actionscript?
Código :
<pre class="prettyprint"> func despedir(nombre: String, años: Int) -> String{ return "Hey \(nombre), tras \(años) en la empresa, ¡Estás despedido!" } despedir("Carlos Paredes", 15)</pre>¿Vieron que escribí "años"? Swift soporta cualquier tipo de carácter ASCII en las variables. Hasta emojis.
Algo muy cool es poder mandar "n" cantidad de parametros
Código :
<pre class="prettyprint"> func oprah(nombres: String...) -> Int { var carros = 0 for nombre in nombres { println ("Y \(nombre) tiene un carro nuevo! ") carros += 1 } return carros } autos = oprah("Anonimo", "Harvey", "Diego", "Yohan", "Link") println("\(autos) carros entregados")</pre>Y para el momento Xzibit, podemos meter funciones dentro de funciones
Código :
<pre class="prettyprint"> func xzibit() -> String { var mensaje = "Yo " func dawg() { mensaje += "Dawg!" } dawg() return mensaje } tweet = xzibit() + String(" I put a closure in your closure")</pre>Las funciones son en si mismas tipos de datos, así que como en Javascript, puedes retornar una función como su propio tipo. Es decir:
Código :
<pre class="prettyprint"> func xzibit() -> (String -> String) { func dawg(cosa: String) -> String { return "Yo Dawg! I put a \(cosa) in your \(cosa)" } return dawg } subfuncion = xzibit() tweet = subfuncion("burrito") //Yo Dawg! I put a burrito in your burrito</pre>Ajá, mi mente también duele. Dale tiempo, experimenta. Se pone más jodido cuando descubres que las funciones pueden ser PARAMETROS de otras funciones.
Objetos y Clases
Todos sabemos que es un objeto ¿Verdad? Pues así se hacen en Swift.
Código :
<pre class="prettyprint"> class Pokemon { var nombre: String = "" var vida = 100 init(nombre: String) { self.nombre = nombre } func herida(fuerza: Int) -> String { vida = vida - fuerza return "\(nombre) es atacado y tiene \(vida) de vida" } }</pre>Y se instancia
Código :
<pre class="prettyprint"> var bulbasaur = Pokemon() bulbasaur.nombre = "Bulbasaur" combate = bulbasaur.herida(10) println(combate)</pre>¿Vieron que se inicializa con "init", el constructor? ¿Vieron que existe "self", pero es opcional? Swift también tiene destructores con "deinit".
Y la herencia es tan fácil como declarar una clase de tipo otra clase. También hay sobrecarga de funciones con override.
Código :
<pre class="prettyprint"> class Pikachu: Pokemon { init(nombre: String) { super.init(nombre) } override func herida(fuerza: Int) -> String { fuerza = fuerza/2 //porque pikachu es más fuerte, get it? return super.herida(fuerza) } func impactrueno() -> Int { return 20 } }</pre>También, en vez de usar variables, puedes usar getters y setters
Código :
<pre class="prettyprint"> class Pikachu: Pokemon { var vida: Int { get { return vida *2 //retorna el doble } set { vida = newValue / 1.5 //sólo le asigna el 50% } } }</pre>Por defecto, el valor de set es "newValue".
También puedes crear "struct" en vez de "class". La diferencia es que una clase tiene herencia, donde una estructura es copiada en vez de referenciada.
Librerías externas
Es tan fácil como hacer import
Código :
<pre class="prettyprint"> import Love var mentiras = Love(true)</pre>Y olvidé las tuplas, enums y otro par de sorpresas. A practicar
Playgrounds Interactivos: Testing en vivo
En XCode ahora puedes crear "Playgrounds" o areas para testear en vivo el código que escribes en Swift. Todo cambia a medida que lo escribes y el area de prueba visual funciona igual que en iOS u OS X.
Ya mismo puedes usar Swift para iOS u OS X bajando el último XCode. Sólo se puede programar en Swift usando un Mac (por ahora) y todas las apps que crees en Swift serán compatibles con iOS 7 y 8, así como OS X Mavericks en adelante.
Si descargas XCode 6 beta, ya estás.
¿Qué tal está Swift? Por favor comparte este tutorial con todos.