2. Contenido
• Lo básico : Variables,
Constantes, Tipado, Strings,
Colecciones
• Operadores, Funciones y
Controladores de Flujo Clases y
propiedades
• Closures, Chaining
• Clases
• Memory management
Initialization
• Swift Playgrounds
• Xcode con Storyboard
• Autolayout y nuevo modelo de
Resizing de apps
• Primera app ios con Swift
• Swift usando cosas de Objective C
• Cocoapods *
• MVCD : Modelo - Vista - Controlador -
Delegate - Datasource *
• Controladores : UITableViewControllers,
UINavigationController,
UITabbarController y UIController *
• Modelos y Parse *
3. Por que Swift y no empezar
con Objective C
• Es más fácil de entender. Mucho más
• Por que Apple realmente esta comprometido en apoyarlo
• Por que no es obligatorio usarlo ni hay que migrar nada a
lo nuevo
• Es excelente para aprender
• Reduce el tamaño de los proyectos, en un 25%
• Toda el API de Apple lo soporta y es totalmente
retrocompatible.
4. Por que NO Swift y mejor
empezar con Objective C
• Por que no hay documentación completa aún en
sitios conocidos. Creemosla!
• Por que al googlear solo hay cosas de Taylor y
códigos interbancarios
• Por que al final uno termina aprendiendo
Objective C al mismo tiempo.
8. A considerar
• Swift es una versión final, Xcode ni IOS 8 lo son
• Hay bugs conocidos en los betas. (Yo uso el Beta
2 de XCode)
• Es posible que muchas cosas de Apple esten en
NDA. Revise todo para que lo que esté aquí no lo
esté
• Mi Xcode puede tronar en cualquier momento.
Tengan un poco de paciencia si esto ocurre.
11. Variable NO MUTABLE
let languageName: String = "Swift"
AKA Constante
Variables que no cambian después de crearse.
Ahorramos memória
12. Declaración : Optionals
No existe en C o en Objective-C
Es básicamente y en pocas palabras permitir
variables poder ser nil o no permitirles.
var serverResponseCode: Int? = 404
serverResponseCode = nil
var surveyAnswer: String? // automáticamente nil
13. Unwarping
let possibleString: String? = “string." // nil o string
println(possibleString!) // para verificar que no sea nil
let assumedString: String! = “implicito" // siempre existe
println(assumedString) // no se necesita
14. Pueden ser de mas tipos
¿Es enserio? tanto para casi volver a escribir mucho código
22. Mutabilidad
var variableString = "Hola"
variableString += " como estan"
let constantString = "Hola"
constantString += “como estan"
23. Arreglos
var nombres = ["Leonidas", "Harvey", "Cvander", "Freddier"]
var nombres = ["Anna", "Alex", "Brian", "Jack", true]
var nombres : String []= ["Leonidas", "Harvey", "Cvander",
"Freddier"]
nombres.append("Ajamaica") nombres += "Vaca"
24. var nombre = nombres[0]
nombres[4...6] = ["Cambio", “Nuevo"] // sustituye del 4 al 6
nombres.insert("Ricardo", atIndex: 0)
let ricky = nombres.removeAtIndex(0)
for item in nombres {
println(item)
}
25. Mágia
var threeDoubles = [Double](count: 3, repeatedValue: 0.0)
!
// threeDoubles es tipo [Double], donde tiene [0.0, 0.0, 0.0]
var anotherThree= [Double](count: 3, repeatedValue: 2.5)
// [2.5, 2.5, 2.5]
26. Diccionarios
var miscursos = ["html": 6, "python": 0, "ios": 4]
miscursos["html"] = "7"
for (curso, veces) in miscursos {
println("(curso): (veces)")
}
27. Mágia
if let oldValue = miscursos.updateValue(8, forKey: "HTML")
{
println(“Viejo valor (oldValue).")
}
for skey in miscursos.keys {
println("keys: (skey)")
}
39. Paso por valor
func intercambia(inout a: Int, inout b: Int) {
let tempA = a
a = b
b = tempA
}
var a = 3
var b = 107
intercambia(&someInt, &anotherInt)
println(“Cambio (someInt), y tambien (anotherInt)")
40. Funciones “Funcionales”
func sumar(a: Int, b: Int) -> Int {
return a + b
}
func multiplicar(a: Int, b: Int) -> Int {
return a * b
}
!
var tempfunc: (Int, Int) -> Int = sumar
!
println("Result: (mathFunction(2, 3))")
tempfunc = multiplicar
println("Result: (mathFunction(2, 3))")
41. Funciones como parámetro
de otras
func imprimir(tempfunc: (Int, Int) -> Int, a: Int, b: Int) {
println("Resultado: (tempfunc(a, b))")
}
imprimir(sumar, 3, 5)
42. Closures
Los closures, en castellano cierres o clausuras, son una
potente característica de JavaScript que también podemos
encontrar en otros lenguajes como C#, Objective-C, Eiffel y
otros.
!
Es la manera en como una función dentro de otra función
contenedora puede hacer referencia a las variables
después de que la función contenedora ha terminado de
ejecutarse.
Recuerda el curso Frontend de Mejorando.la
43. func incrementar(incrementeLaCantidad cantidad: Int) -> () -> Int {
var corrio = 0
!
func incrementador() -> Int {
corrio += cantidad
return corrio
}
!
return incrementador
}
!
let incrementa10 = incrementar(forIncrement: 10)
let incrementa20 = incrementar(forIncrement: 20)
!
incrementa10()
incrementa20()
44. var numbers = [20, 19, 7, 12]
!
numbers.map({
(number: Int) -> Int in
if n % 2 == 0 {
return n
}
else {
return 0
}
})
!
La function map ejecuta el
closure para cada elemento del
arrego.
45. var reversa = sorted(nombres, { (s1: Int, s2: Int) -> Bool in
return s1 > s2
})
func reversaFuncAuc(s1: Int, s2: Int) -> Bool {
return s1 > s2
}
var reversa = sorted(nombres, reversaFuncAuc)
La función sorted
ordena los números
dada una función
var reversed = sorted(nombres, { s1, s2 in return s1 > s2 } )
Newbie
Común
Pro
reversed = sorted(nombres, { $0 > $1 }) Swift
52. Más fácil
class Vehiculo {
var numero_ruedas = 0
var descripcion: String {
return "(numero_ruedas) ruedas"
}
}
53. Inicializar
let unvehiculo = Vehiculo()
Aquí no hay razón para ser un var. Lo que cambia es el
contenido del objeto no el objeto como tal
54. Acceder a propiedades
let unvehiculo = Vehiculo()
println(unvehiculo.descripcion)
No lleva () por que no es una función. Por eso vimos
closures. Es como un @property de python
unvehiculo.ruedas = 4
63. Automatic Reference
Counting
Uno de los cambios más abrumadores de iOS ha sido la
inclusión de ARC (Automatic Reference Counting), lo cual facilita
al desarrollador la gestión de memoria, uno de los puntos mas
conflictivos del desarrollo iOS.
!
Esto erá el cancer de IOS hasta la llegada de ARC.
64. Un concepto que deberemos tener siempre en mente es
el tipo de relación que queremos establecer entre el
puntero y los objetos a los que apunta. Ésta podrá ser de
dos tipos dependiendo de su naturaleza:
!
Strong: un puntero de este tipo, implica que nuestra
variable será la dueña del objeto al que apunta el
puntero, y por tanto no se liberará el mismo mientras el
puntero siga activo.
!
Weak: es un puntero que no implica que nuestra variable
sea dueña del objeto apuntado. De este modo, si por
cualquier motivo el objeto apuntado fuera liberado,
nuestro puntero pasaría ser automáticamente NIL (esto
evita que se produzcan errores por apuntar a direcciones
de memoria inexistentes).
79. UITableViewController
La vista de tabla (UITableView) es el componente central en
muchas aplicaciones. Es un elemento con muchas opciones, es
importante que aprendamos a utilizarlas correctamente.
!
Las clases que intervienen a la hora de representar una tabla son:
UITableView : La tabla en sí
UITableViewCell : Cada una de las celdas de una tabla
!
Para empezar a trabajar con las tablas, vamos a crear un nuevo
controlador que llamaremos CTControllerView y haremos que sea
una subclase de UITableViewController.
80. UITableview
• Viendo la implementación que nos creó por defecto Xcode, vemos que hay
muchos métodos propios de un controlador de tabla.
• Estos métodos en realidad son de los protocolosUITableViewDelegate y
UITableViewDataSource. El delegate tiene información de cómo se tiene que
comportar la tabla, por ejemplo el tamaño de las celdas, el método que se ejecuta
cuando se selecciona una celda, etc. Por otro lado, el datasource tiene
información del contenido que tiene que mostrar la tabla, por ejemplo el número
de celdas, el número de secciones, el contenido de las celdas, etc. Revisa la
documentación de las dos clases para que veas los métodos que tienen.
• Observando la documentación vemos que los únicos métodos que son requeridos
son:
• tableView:cellForRowAtIndexPath : Devuelve la celda configurada.
• tableView:numberOfRowsInSection : Devuelve el número de celdas que hay en
cada sección. Por defecto hay una única sección.