Patrones de diseño en Swift: ejemplos de código para desarrolladores iOS

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Patrones de diseño en Swift: de la teoría a la práctica

Los patrones de diseño son soluciones probadas para problemas típicos en el desarrollo. Para un desarrollador de iOS en Swift, dominar los patrones no es solo un plus en el currículum, sino una necesidad. Ayudan a escribir código limpio, reutilizable y testeable. En este artículo analizaremos 5 patrones clave con ejemplos reales en Swift.



1. Singleton (Instancia única)

Uno de los patrones más populares en iOS. Garantiza que una clase tenga solo una instancia y proporciona un punto de acceso global a ella.



Implementación en Swift

class NetworkManager {    static let shared = NetworkManager()    private init() {} // prevenimos la creación de otras instancias

func requestData(from url: URL) { // lógica de la solicitud print("Solicitud a \\(url.absoluteString)") }}

// UsoNetworkManager.shared.requestData(from: URL(string: "https://api.example.com")!)


Cuándo usarlo: para gestionar recursos compartidos (red, base de datos, UserDefaults). Desventaja: dificulta las pruebas unitarias, por lo que no se debe abusar de él.



2. Factory Method (Método de fábrica)

Define una interfaz para crear un objeto, pero permite que las subclases modifiquen el tipo de objeto creado. Es ideal cuando no se sabe de antemano qué objeto se necesitará.



Ejemplo: creación de elementos de UI

protocol Button {    func render()}

class iOSButton: Button { func render() { print("Botón estilo iOS") }}

class macOSButton: Button { func render() { print("Botón estilo macOS") }}

enum Platform { case iOS, macOS}

class ButtonFactory { static func createButton(for platform: Platform) -> Button { switch platform { case .iOS: return iOSButton() case .macOS: return macOSButton() } }}

// Usolet button = ButtonFactory.createButton(for: .iOS)button.render() // Botón estilo iOS


3. Observer (Observador)

Permite que los objetos se suscriban a eventos y reciban notificaciones sobre cambios. En Swift se implementa de forma nativa mediante NotificationCenter y Combine.



Ejemplo con NotificationCenter

extension Notification.Name {    static let userDidLogin = Notification.Name("userDidLogin")}

class AuthManager { func login() { // lógica de inicio de sesión NotificationCenter.default.post(name: .userDidLogin, object: nil) }}

class ProfileViewController { init() { NotificationCenter.default.addObserver( self, selector: #selector(updateUI), name: .userDidLogin, object: nil ) }

@objc func updateUI() { print("Actualizando perfil después del inicio de sesión") }

deinit { NotificationCenter.default.removeObserver(self) }}


Alternativa moderna: usa Combine (iOS 13+) con @Published y PassthroughSubject para programación reactiva.



4. Delegate (Delegado)

Uno de los patrones fundamentales de Cocoa Touch. Permite que un objeto delegue la ejecución de tareas a otro. Se usa ampliamente en UIKit (por ejemplo, UITableViewDelegate).



Creación de un delegado propio

protocol DownloadDelegate: AnyObject {    func didFinishDownloading(data: Data)    func didFailWithError(error: Error)}

class Downloader { weak var delegate: DownloadDelegate?

func download(from url: URL) { // simulación de descarga let data = Data() delegate?.didFinishDownloading(data: data) }}

class ViewController: UIViewController, DownloadDelegate { let downloader = Downloader()

override fu

Blogs

Book Recommendations