Las funciones y las estructuras de control son el motor lógico de cualquier app en Swift: permiten ejecutar código condicional, repetir tareas y organizar la lógica en bloques reutilizables.
Qué es una función en Swift
Una función es un bloque de código con nombre que puedes ejecutar cuando lo necesites. Evita repetir el mismo código en varios lugares de tu app.
La sintaxis básica es:
func nombreDeLaFuncion(parametro: Tipo) -> TipoDeRetorno {
// código
return valor
}
Usa func para declarar la función. El símbolo -> indica el tipo de dato que regresa.
Funciones sin retorno
Algunas funciones solo ejecutan una acción sin devolver ningún valor. En ese caso omites -> TipoDeRetorno.
func mostrarBienvenida(nombre: String) {
print("Hola, \(nombre). Bienvenido a Liverpool.")
}
mostrarBienvenida(nombre: "Ana")
// Imprime: Hola, Ana. Bienvenido a Liverpool.
Este patrón es útil para mostrar mensajes, registrar eventos o actualizar la interfaz.
Funciones con retorno
Cuando tu función necesita calcular y devolver un resultado, usa return.
func calcularDescuento(precio: Double, porcentaje: Double) -> Double {
return precio - (precio * porcentaje / 100)
}
let precioFinal = calcularDescuento(precio: 850.0, porcentaje: 15.0)
print("Precio con descuento: $\(precioFinal)")
// Imprime: Precio con descuento: $722.5
Este ejemplo simula un descuento en un producto de Mercado Libre. El valor devuelto se guarda en precioFinal.
Funciones con múltiples parámetros
Puedes declarar tantos parámetros como necesites, separados por comas.
func calcularSalarioNeto(salarioBruto: Double, porcentajeIMSS: Double) -> Double {
let descuentoIMSS = salarioBruto * porcentajeIMSS / 100
return salarioBruto - descuentoIMSS
}
let neto = calcularSalarioNeto(salarioBruto: 18500, porcentajeIMSS: 4.0)
print("Salario neto: $\(neto)")
// Imprime: Salario neto: $17,760
Este ejemplo modela el descuento del IMSS sobre un salario. Los salarios en México van de $10,000 a $30,000 al mes según puesto y empresa.
La estructura if / else
La estructura if ejecuta código solo cuando una condición es verdadera. Si la condición es falsa, puedes usar else para definir qué pasa en ese caso.
let stockProducto = 3
if stockProducto > 0 {
print("Producto disponible en FEMSA.")
} else {
print("Producto agotado.")
}
// Imprime: Producto disponible en FEMSA.
Puedes encadenar condiciones con else if:
let calificacion = 75
if calificacion >= 90 {
print("Excelente")
} else if calificacion >= 70 {
print("Aprobado")
} else {
print("Reprobado")
}
// Imprime: Aprobado
La estructura switch
switch evalúa un valor y ejecuta el bloque que coincide con ese valor. Es más legible que múltiples else if cuando tienes muchos casos.
let categoriaProducto = "pan"
switch categoriaProducto {
case "pan":
print("Producto de Bimbo: pan de caja.")
case "refresco":
print("Producto de FEMSA: Coca-Cola.")
case "ropa":
print("Producto de Liverpool: camisa.")
default:
print("Categoría no reconocida.")
}
// Imprime: Producto de Bimbo: pan de caja.
El caso default es obligatorio en Swift cuando los demás casos no cubren todos los valores posibles. Si lo omites, el compilador arroja un error.
switch con rangos
Swift permite usar rangos dentro de switch, lo que es muy útil para clasificar datos numéricos.
let precioArticulo = 1200
switch precioArticulo {
case 0..<500:
print("Artículo económico")
case 500..<1500:
print("Artículo de precio medio")
case 1500...:
print("Artículo premium")
default:
break
}
// Imprime: Artículo de precio medio
El ciclo for-in
El ciclo for-in recorre una colección o un rango de valores, ejecutando el bloque de código en cada iteración.
let productos = ["Gansito", "Marinela", "Nito"]
for producto in productos {
print("Producto Bimbo: \(producto)")
}
// Imprime:
// Producto Bimbo: Gansito
// Producto Bimbo: Marinela
// Producto Bimbo: Nito
También puedes iterar sobre un rango numérico:
for numero in 1...5 {
print("Orden #\(numero) procesada")
}
// Imprime:
// Orden #1 procesada
// Orden #2 procesada
// ... hasta Orden #5 procesada
El ciclo while
El ciclo while repite un bloque mientras una condición sea verdadera. Úsalo cuando no sabes de antemano cuántas veces se repetirá.
var intentos = 0
while intentos < 3 {
print("Verificando pago con tarjeta... intento \(intentos + 1)")
intentos += 1
}
// Imprime tres líneas de verificación
Este patrón simula reintentos de pago, algo común en apps de e-commerce como Mercado Libre.
Combinar funciones con estructuras de control
El poder real aparece cuando combinas funciones con if, switch y for. Así construyes lógica compleja de forma organizada.
func clasificarProducto(precio: Double) -> String {
switch precio {
case 0..<200:
return "Económico"
case 200..<1000:
return "Precio medio"
default:
return "Premium"
}
}
let precios = [150.0, 450.0, 2300.0]
for p in precios {
let categoria = clasificarProducto(precio: p)
print("$\(p) → \(categoria)")
}
// Imprime:
// $150 → Económico
// $450 → Precio medio
// $2,300 → Premium
Esta función puede integrarse directamente en una app de catálogo de productos para etiquetar artículos automáticamente.
Errores comunes
1. Olvidar el default en switch
Swift requiere que switch cubra todos los casos posibles. Si trabajas con String o Int sin rangos exhaustivos, agrega siempre default: o el compilador marcará error.
2. Confundir = con == en condiciones
Escribir if stock = 0 intenta asignar un valor, no comparar. En Swift esto genera un error de compilación. Usa siempre == para comparar: if stock == 0.
3. Ciclo infinito con while
Si la condición de while nunca se vuelve falsa, tu app se congela. Asegúrate de que la variable que controla el ciclo cambie en cada iteración. Siempre incluye una línea como intentos += 1 dentro del ciclo.
4. Nombre de parámetro incorrecto al llamar la función
Swift exige que uses el nombre del parámetro al llamar la función: calcularDescuento(precio: 850, porcentaje: 15). Si escribes solo calcularDescuento(850, 15), el compilador arroja error. Los nombres de parámetros son parte de la firma de la función en Swift.
Tabla de referencia rápida
| Estructura | Uso principal | Ejemplo de aplicación |
|---|---|---|
func |
Organizar lógica reutilizable | Calcular descuentos, validar datos |
if / else |
Decisiones binarias o múltiples | Verificar stock, aprobar pedido |
switch |
Múltiples casos conocidos | Clasificar categorías de producto |
for-in |
Recorrer listas o rangos | Iterar un carrito de compras |
while |
Repetir mientras se cumpla condición | Reintentar conexión o pago |
Puntos clave
functe permite encapsular lógica y reutilizarla sin repetir código. Declara el tipo de retorno con->cuando la función devuelva un valor.if / else if / elsecontrola qué código se ejecuta según condiciones booleanas. Usa==para comparar, nunca=.switches más legible que cadenas largas deelse if. Siempre incluyedefault:cuando los casos no son exhaustivos.for-inrecorre colecciones y rangos de forma segura y clara. Es la estructura más usada para procesar listas de datos en apps reales.- Combinar funciones con estructuras de control es la base de la lógica de cualquier app. Una función bien nombrada hace tu código más fácil de leer y mantener.