Introducción a la programación funcional en Swift
Swift es un lenguaje de programación multiparadigma, desarrollado por Apple para crear aplicaciones para iOS, macOS, watchOS y tvOS. Además de los enfoques orientado a objetos y orientado a protocolos, Swift admite activamente la programación funcional. Este estilo se basa en el uso de funciones puras, inmutabilidad de datos y la eliminación de efectos secundarios.
La programación funcional hace que el código sea más predecible, comprobable y seguro para la concurrencia. En este artículo, analizaremos los conceptos clave del enfoque funcional en Swift: inmutabilidad, funciones de orden superior, closures y cadenas de métodos. Verá cómo usar map, filter y reduce para escribir código conciso y expresivo.
Fundamentos del enfoque funcional en Swift
Inmutabilidad
En la programación funcional, los datos no se modifican después de su creación. En lugar de modificar un objeto existente, se crea uno nuevo. Swift fomenta este enfoque con la palabra clave let para declarar constantes.
// Valor inmutablelet numbers = [1, 2, 3, 4, 5]// numbers.append(6) // Error de compilación — numbers es inmutable
// Creación de un nuevo arraylet newNumbers = numbers + [6]print(newNumbers) // [1, 2, 3, 4, 5, 6]Usar let en lugar de var ayuda a evitar cambios accidentales de estado y simplifica la depuración.
Funciones como objetos de primera clase
En Swift, las funciones son objetos de primera clase. Se pueden asignar a variables, pasar como argumentos y devolver desde otras funciones.
// Función asignada a una variablelet multiply: (Int, Int) -> Int = { $0 * $1 }print(multiply(3, 4)) // 12
// Función que recibe otra funciónfunc applyOperation(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int { return operation(a, b)}
let result = applyOperation(10, 5, operation: multiply)print(result) // 50Closures en Swift
Los closures son bloques de funcionalidad autocontenidos que pueden capturar y almacenar referencias a variables del contexto circundante. En Swift, los closures se utilizan ampliamente para callbacks y transformaciones funcionales.
// Closure simplelet greeting = { (name: String) -> String in return "¡Hola, \\(name)!"}print(greeting("Mundo")) // ¡Hola, Mundo!
// Forma abreviada con parámetroslet numbers = [3, 1, 4, 1, 5, 9]let sorted = numbers.sorted { $0 < $1 }print(sorted) // [1, 1, 3, 4, 5, 9]Los closures hacen que el código sea compacto y expresivo, especialmente al trabajar con colecciones.
Funciones de orden superior: map, filter, reduce
Estos son los tres pilares de la programación funcional en Swift. Permiten procesar arrays, diccionarios y otras colecciones sin bucles explícitos.
map — transformación de cada elemento
El método map aplica un closure a cada elemento de la colección y devuelve un nuevo array con los resultados.
let prices = [100, 200, 300, 400]let discounted = prices.map { $0 * 0.9 }print(discounted) // [90.0, 180.0, 270.0, 360.0]
// Trabajo con stringslet names = ["Ana", "Boris", "Víctor"]let uppercased = names.map { $0.uppercased() }print(uppercased) // ["ANA", "BORIS", "VÍCTOR"]filter — selección por condición
filter devuelve un nuevo array que contiene solo los elementos que cumplen una condición dada.
let scores = [45, 78, 92, 33, 88, 61]let passingScores = scores.filter { $0 >= 60 }print(passingScores) // [78, 92, 88, 61]
// Filtrado de stringslet words = ["Swift", "iOS", "macOS", "función"]let shortWords = words.filter { $0.count <= 4 }print(shortWords) // ["iOS", "macOS"]