Padrões de Projeto em Swift: Guia Prático para Desenvolvedores iOS/macOS
Padrões de projeto (design patterns) são soluções comprovadas para problemas típicos no desenvolvimento de software. Para desenvolvedores iOS/macOS, conhecer os padrões em Swift é uma habilidade obrigatória, permitindo criar aplicações escaláveis, testáveis e de fácil manutenção. Neste artigo, vamos analisar 4 padrões-chave com exemplos reais de código.
1. Singleton
Um dos padrões mais populares no desenvolvimento iOS. Garante que uma classe tenha apenas uma instância e fornece um ponto de acesso global a ela. Usado para gerenciar recursos compartilhados: UserDefaults, NetworkManager, Database.
Implementação Singleton em Swift
class NetworkManager { static let shared = NetworkManager() private init() { } func fetchData(from url: URL) { // lógica da requisição print("Dados recebidos de \\(url)") }}
// UsoNetworkManager.shared.fetchData(from: URL(string: "https://api.example.com")!)Importante: No Swift 5.5+, use actor para segurança de threads:
actor SettingsManager { static let shared = SettingsManager() private var settings: [String: String] = [:] func setValue(_ value: String, forKey key: String) { settings[key] = value } func getValue(forKey key: String) -> String? { return settings[key] }}2. Factory Method
Define uma interface para criar objetos, mas permite que subclasses alterem o tipo dos objetos criados. Ideal para criar diferentes tipos de componentes de UI ou modelos de dados.
Exemplo: criação de botões para diferentes plataformas
protocol Button { func render()}
class iOSButton: Button { func render() { print("Renderizando botão iOS com cantos arredondados") }}
class macOSButton: Button { func render() { print("Renderizando botão macOS com gradiente") }}
protocol ButtonFactory { func createButton() -> Button}
class iOSButtonFactory: ButtonFactory { func createButton() -> Button { return iOSButton() }}
class macOSButtonFactory: ButtonFactory { func createButton() -> Button { return macOSButton() }}
// Usolet factory: ButtonFactory = iOSButtonFactory()let button = factory.createButton()button.render() // "Renderizando botão iOS com cantos arredondados"3. Observer
Permite que objetos se inscrevam em eventos e recebam notificações sobre mudanças. Em Swift, é implementado através de NotificationCenter, Combine ou didSet.
Implementação via Combine (iOS 13+)
import Combine
class WeatherStation { @Published var temperature: Double = 0.0 func updateTemperature(_ temp: Double) { temperature = temp }}
class WeatherDisplay { var subscriptions = Set<AnyCancellable>() let station = WeatherStation() func startObserving() { station.$temperature .sink { [weak self] newTemp in print("Temperatura alterada: \\(newTemp)°C") self?.updateUI(with: newTemp) } .store(in: &subscriptions) } private func updateUI(with temp: Double) { // Atualização da interface }}Implementação clássica via protocolo
protocol Observer: AnyObject { func update(value: Int)}
class Subject { private var observers = [Observer]() func attach(_ observer: Observer) { observers.append(observer) } func detach(_ observer: Observer) { observers.removeAll { $0 === obs
```