Apple ha presentado su nuevo lenguaje de programación llamado Swift con el que podrás desarrollar aplicaciones para iOS y OS X, este nuevo lenguaje viene para reemplazar a Objective-C, lenguaje que para muchos es muy complicado de aprender, por eso Apple nos ha presentado un lenguaje de última generación muy fácil de aprender, este lenguaje estña está inspirado en JavaScript, Groovy, Scala, Java y C#.
Guía rápida para Swift
Una pequeña guía sobre como usar el nuevo lenguaje de programación de Apple llamado Swift
Lo básico
println("Hola mundo")
var miVariable = 42 // Variable
let miConstante = 3.1415926 // Constante
let doubleExplicito: Double = 70 // Constante con tipo explícito
let etiqueta = "Algún texto " + String(miVariable) // Casting
let textoPi = "Pi = \\(miConstante)" // Interpolación de cadena
var cadenaOpcional: String? = "opcional" // Puede ser nil
cadenaOpcional = nil // Cadena con valor opcional
Estructuras de control
Iteración sobre un array
let miArray = [1, 1, 2, 3, 5]
for valor in miArray {
if valor == 1 {
println("¡Uno!")
} else {
println("¡No es uno!")
}
}
Iteración sobre un diccionario
var diccionario = [
"nombre": "Steve Jobs",
"puesto": "CEO",
"empresa": "Apple"
]
for (clave, valor) in diccionario {
println("\\(clave): \\(valor)")
}
Iteración sobre un rango, creamos un rango con -1…1 que equivale a [-1, 0, 1], también se puede usar .. (solo dos puntos) para ignorar el último número.
for i in -1...1 {
println(i)
}
Iteración ignorando el valor actual del rango en cada iteración del bucle
for _ in 1...3 {
// Hacer algo 3 veces.
}
La estructura while
var i = 1
while i < 1000 {
i *= 2
}
La estructura do while
do {
println("Hola")
} while 1 == 2
La estructura Switch
let vegetal = "chile serrano"
switch vegetal {
case "apio":
let comentarioVegetal = "Agrega un poco de pasas para preparar sopa de hormigas."
case "pepino", "berros":
let comentarioVegetal = "Eso haría un delicioso sandwich de té."
case let x where x.hasSuffix("chile"):
let comentarioVegetal = "Es muy picante el \\(x)?"
default: // obligatorio (para poder cubrir todas las salidas posibles)
let comentarioVegetal = "Todo sabe delicioso en la sopa."
}
Switch para validar el contenido de una plist
let ciudad:Dictionary<String, AnyObject> = [
"nombre" : "Ciudad de México",
"población" : 20_537_000,
"abreviación" : "MX"
]
switch (ciudad["nombre"], ciudad["población"], ciudad["abreviación"]) {
case (.Some(let nombreCiudad as NSString),
.Some(let pop as NSnúmero),
.Some(let abreviación as NSString))
where abreviación.length == 2:
println("Nombre de la ciudad: \\(nombreCiudad) | abreviación.:\\(abreviación) población: \\(pop)")
default:
println("No es una ciudad válida")
}
Funciones
Las funciones son un tipo de primera clase, lo que significa que pueden ser anidadas en otras funciones y pueden ser transferibles.
Función que regresa una cadena
func saludo(nombre: String, día: String) -> String {
return "Hola \\(nombre), hoy es \\(día)."
}
saludo("Juan", "Viernes") // Llamamos a la función saludo
Función que regresa múltiples elemento de una tupla
func obtenerPreciosDeGasolina() -> (Double, Double, Double) {
return (12.68, 13.34, 13.17)
}
Función que toma un número variable de argumentos, poniéndolos dentro de una matriz
func poner(números: Int...) {
// hacer algo
}
poner(5, 16, 38) // Llama la función _poner_ con un array de entradas
Pasando y regresando funciones
func hacerIncrementable() -> (Int -> Int) {
func agregarUno(número: Int) -> Int {
return 1 + número
}
return agregarUno
}
var incrementar = hacerIncrementable()
incrementar(7)
Clausuras
Las funciones son un tipo especial de clausuras ({})
Ejemplo de una clausura
->
separa los argumentos y el tipo de retornoin
separa el encabezado de la clausura del cuerpo de la clausura
.
var números = [1, 2, 3, 4, 5]
números.map({
(número: Int) -> Int in
let resultado = 3 * número
return resultado
})
Cuando se conoce el tipo, al igual que anteriormente, podemos hacer esto
números = [1, 2, 6]
números = números.map({ número in 3 * número })
println(números) // [3, 6, 18]
Cuando la clausura es el último argumento, se puede colocar después de la )
Cuando la clausura es el único argumento, puedes omitir el () en su totalidad
También puedes hacer referencia a los argumentos de la clausura por posición ($0, $1, …) en lugar del nombre.
números = [2, 5, 1]
números.map { 3 * $0 } // [6, 15, 3]
Clases
Todos los métodos y propiedades de una clase son públicos. Si sólo necesitas almacenar los datos en un objeto estructurado, debes utilizar una estructura (struct)
Una clase padre de un figura
class Figura {
init() {
}
func getArea() -> Int {
return 0;
}
}
Una clase Cuadrado
que extiende la clase Figura
class Cuadrado: Figura {
var largoLado: Int
// Un getter y setter personalizado
var perímetro: Int {
get {
return 4 * largoLado
}
set {
largoLado = newValue / 4
}
}
init(largoLado: Int) {
self.largoLado = largoLado
super.init()
}
func encoger() {
if largoLado > 0 {
--largoLado
}
}
override func getArea() -> Int {
return largoLado * largoLado
}
}
var miCuadrado = Cuadrado(largoLado: 5)
print(miCuadrado.getArea()) // 25
miCuadrado.encoger()
print(miCuadrado.largoLado) // 4
Acceder al objeto de la clase Cuadrado. Equivalente a [Cuadrado class]
en Objective-C.
Cuadrado.self
Si no necesitas un getter y setter personalizado, pero aún quieres correr código antes de un después de obtener o establecer una propiedad, puedes usar willSet
y didSet
Tipos enumerados (Enums)
Los tipos enumerados pueden ser opcionalmente ser de un tipo específico. Pueden contener métodos como las clases.
enum Juego {
case Espadas, Corazones, Diamantes, Tréboles
func obtenerIcono() -> String {
switch self {
case .Espadas: return "♤"
case .Corazones: return "♡"
case .Diamantes: return "♢"
case .Tréboles: return "♧"
}
}
}
Aprender más
- Sitio oficial
- Guía (en inglés)
- Libro oficial (en inglés)