Hoja de Trucos de Swift
Última actualización
Hola Mundo y conceptos básicos
Swift no necesita código repetitivo a nivel superior: una sola línea se ejecuta.
| Operación | Sintaxis |
|---|---|
| Imprimir una línea | print("Hello, World!") |
| Imprimir sin salto de línea | print("Hi", terminator: "") |
| Interpolación de cadenas | print("Hi \(name)") |
| Comentario | // this is a comment |
| Comentario de varias líneas | /* ... */ |
| Importar un módulo | import Foundation |
| Ejecutar un archivo | swift run o swift main.swift |
Variables (let / var) y tipos
Usa let para constantes y var para valores mutables; los tipos suelen inferirse.
| Operación | Sintaxis |
|---|---|
| Constante | let age = 30 |
| Variable | var count = 0 |
| Tipo explícito | let name: String = "Ada" |
| Tipos básicos | Int, Double, String, Bool, Character |
| Conversión de tipo | Double(i), String(n), Int("42") |
| Tupla | let pair = (1, "a") |
| Alias de tipo | typealias ID = Int |
| Comprobar el tipo | value is String, value as? String |
Opcionales
Los opcionales modelan la posible ausencia de un valor; desenvuélvelos antes de usarlos.
| Operación | Sintaxis |
|---|---|
| Declarar un opcional | var name: String? = nil |
| Enlace de opcional | if let n = name { ... } |
| Desenvolver con guard | guard let n = name else { return } |
| Fusión de nulos | let n = name ?? "default" |
| Encadenamiento de opcionales | user?.address?.city |
| Desenvolver forzado (inseguro) | name! |
| Desenvuelto implícitamente | var name: String! |
| Mapear sobre un opcional | name.map { $0.count } |
Cadenas
Las cadenas son tipos de valor con soporte completo de Unicode.
| Operación | Sintaxis |
|---|---|
| Longitud | s.count |
| Mayúsculas / minúsculas | s.uppercased(), s.lowercased() |
| Concatenar | "foo" + "bar" |
| Interpolación | "Total: \(price)" |
| Contiene | s.contains("ell") |
| Tiene prefijo / sufijo | s.hasPrefix("he") |
| Dividir | s.split(separator: ",") |
| Reemplazar | s.replacingOccurrences(of: "a", with: "b") |
| Cadena de varias líneas | """ ... """ |
Colecciones (Array, Dictionary, Set)
Tres tipos de colección principales, todos tipos de valor.
| Operación | Sintaxis |
|---|---|
| Literal de array | var nums = [1, 2, 3] |
| Añadir | nums.append(4) |
| Acceder / contar | nums[0], nums.count |
| Map / filter | nums.map { $0 * 2 }, nums.filter { $0 > 1 } |
| Literal de diccionario | var ages = ["Ada": 30] |
| Acceso al diccionario | ages["Ada"] devuelve un opcional |
| Literal de conjunto | var ids: Set = [1, 2, 3] |
| Insertar en un conjunto | ids.insert(4) |
| Iterar un diccionario | for (k, v) in ages { ... } |
Control de flujo
Las condiciones no necesitan paréntesis; switch debe ser exhaustivo.
| Operación | Sintaxis |
|---|---|
| If / else | if x > 0 { ... } else { ... } |
| Ternario | let r = x > 0 ? "pos" : "neg" |
| Switch | switch n { case 1: ...; default: ... } |
| Switch con rango | case 1...5: ... |
| Bucle for-in | for i in 0..<10 { ... } |
| For-in sobre un array | for item in items { ... } |
| Bucle while | while x < 100 { ... } |
| Repeat-while | repeat { ... } while x < 100 |
| Break / continue | break, continue |
Funciones y closures
Las funciones tienen parámetros con etiqueta; los closures son bloques de código autocontenidos.
| Operación | Sintaxis |
|---|---|
| Definir una función | func add(a: Int, b: Int) -> Int { a + b } |
| Etiqueta externa | func greet(to name: String) { ... } |
| Parámetro por defecto | func greet(name: String = "World") { ... } |
| Parámetro variádico | func sum(_ nums: Int...) -> Int { ... } |
| Varios retornos (tupla) | func bounds() -> (min: Int, max: Int) { ... } |
| Expresión de closure | let f = { (x: Int) -> Int in x * x } |
| Closure final | nums.map { $0 * 2 } |
| Argumentos abreviados | { $0 + $1 } |
Structs vs clases
Los structs son tipos de valor (se copian); las clases son tipos de referencia (se comparten).
| Operación | Sintaxis |
|---|---|
| Definir un struct | struct Point { var x: Int; var y: Int } |
| Definir una clase | class Person { var name: String } |
| Inicializador de clase | init(name: String) { self.name = name } |
| Crear una instancia | let p = Point(x: 1, y: 2) |
| Método mutating de struct | mutating func move() { x += 1 } |
| Método de clase | func greet() { ... } |
| Herencia (solo clases) | class Student: Person { ... } |
| Propiedad calculada | var area: Int { width * height } |
| Miembro estático | static let shared = Manager() |
Enums
Los enums agrupan valores relacionados y pueden llevar datos asociados.
| Operación | Sintaxis |
|---|---|
| Definir un enum | enum Direction { case north, south } |
| Usar un caso | let d = Direction.north |
| Switch sobre un enum | switch d { case .north: ... } |
| Valores brutos | enum Status: Int { case ok = 200 } |
| Acceder al valor bruto | Status.ok.rawValue |
| Inicializar desde el valor bruto | Status(rawValue: 200) |
| Valores asociados | case result(Int, String) |
| Métodos en enums | func label() -> String { ... } |
La sintaxis de Swift que más usas, en una sola página. Esta hoja de trucos de Swift es una referencia rápida para el núcleo del lenguaje: constantes y variables, opcionales, cadenas, colecciones, control de flujo, funciones y closures, además de los structs, las clases y los enums con los que construyes apps de iOS y macOS.
Todo lo que hay aquí es Swift estándar y se compila con la cadena de herramientas oficial. Copia lo que necesites o prueba cada fragmento en vivo en el playground de Swift, sin necesidad de Xcode.
Preguntas frecuentes sobre la hoja de trucos de Swift
¿Esta hoja de trucos de Swift es gratis?
¿Cómo desenvuelvo un opcional en Swift?
nil, así que lo desenvuelves antes de usarlo. Las formas seguras son el enlace de opcional (if let n = name { ... }), un guard let al inicio de una función, el operador de fusión de nulos (name ?? "default") y el encadenamiento de opcionales (user?.name). El desenvolvimiento forzado con name! funciona pero falla si el valor es nil, así que recurre a él solo cuando estés seguro.¿Cuál es la diferencia entre un struct y una clase en Swift?
struct es un tipo de valor: asignarlo o pasarlo crea una copia, así que los cambios no afectan al original. Una class es un tipo de referencia: las copias comparten la misma instancia, y solo las clases admiten herencia. La recomendación de Apple es preferir structs por defecto y usar una clase cuando necesites estado mutable compartido o herencia.