Dos caras de una misma moneda: Enfoque funcional vs orientado a objetos en Swift
\n\nCuando empecé a programar para iOS, pensaba que la programación orientada a objetos era el único camino correcto. Clases, herencia, polimorfismo: todo sonaba como una escritura sagrada para el desarrollador. Pero luego descubrí la programación funcional en Swift, y el mundo se puso patas arriba. Resulta que se puede escribir código que no muta el estado, que es fácil de probar y que parece una fórmula matemática.
\n\nSwift es un lenguaje único. Es multiparadigma. Esto significa que puedes mezclar POO y enfoque funcional en un mismo proyecto, tomando lo mejor de ambos mundos. Pero, ¿cómo no confundirse? ¿Cuándo usar clases y cuándo usar closures y map? Vamos a analizarlo.
\n\nSwift orientado a objetos: lo clásico que funciona
\n\nLa programación orientada a objetos (POO) en Swift se basa en clases, protocolos y herencia. Es un paradigma donde los datos y el comportamiento viven juntos. Creas un modelo —por ejemplo, «Usuario»— y ese objeto sabe cómo presentarse, cómo cambiar su nombre o calcular su edad.
\n\nAquí tienes un ejemplo clásico en Swift:
\n\nclass User {\n var name: String\n var age: Int\n \n init(name: String, age: Int) {\n self.name = name\n self.age = age\n }\n \n func greet() -> String {\n return "Hola, me llamo \\(name) y tengo \\(age) años."\n }\n \n func haveBirthday() {\n age += 1\n }\n}\n\nlet user = User(name: "Ana", age: 25)\nuser.haveBirthday()\nprint(user.greet()) // Hola, me llamo Ana y tengo 26 años.\n\nEn este código usamos el enfoque orientado a objetos en Swift. Tenemos estado (propiedades name, age) que puede cambiar (método haveBirthday). Esto es intuitivo, especialmente si vienes de Java o C++. Pero hay un detalle: el estado mutable es fuente de errores. Cuantos más objetos se modifican entre sí, más difícil es depurar el programa.
\n\nSwift funcional: el poder de los closures y la inmutabilidad
\n\nLa programación funcional en Swift ofrece otra perspectiva. Aquí las funciones son «ciudadanos de primera clase». Puedes pasarlas como parámetros, devolverlas desde otras funciones y almacenarlas en variables. El principio principal son las funciones puras (pure functions), que no cambian el estado externo y siempre devuelven el mismo resultado para los mismos datos de entrada.
\n\nVeamos cómo se ve el mismo ejemplo en estilo funcional:
\n\nstruct User {\n let name: String\n let age: Int\n}\n\nfunc greet(user: User) -> String {\n return "Hola, me llamo \\(user.name) y tengo \\(user.age) años."\n}\n\nfunc haveBirthday(user: User) -> User {\n return User(name: user.name, age: user.age + 1)\n}\n\nlet user = User(name: "Ana", age: 25)\nlet olderUser = haveBirthday(user: user)\nprint(greet(user: olderUser)) // Hola, me llamo Ana y tengo 26 años.\n\nObserva: usamos una estructura (struct), no una clase. Las estructuras en Swift son tipos de valor (value types). Se copian al asignarse. La función haveBirthday no muta el objeto original, sino que crea uno nuevo. Esta es la idea clave del enfoque funcional: la inmutabilidad (immutability).
Comparación de enfoques: ¿cuándo usar cada uno?
\n\nAhora comparemos honestamente la POO y la programación funcional en Swift. Cada una tiene sus puntos fuertes.
\n\nEnfoque orientado a objetos en Swift
\n\n- \n
- Ventajas: Intuitivo para modelar el mundo real. Ideal para componentes de UI (UIViewController, UIView). La herencia facilita la reutilización de código. \n
- Desventajas: Mutabili