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#.

Apple Swift Logo

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 retorno
  • in 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