Entwurfsmuster in Swift: Ein praktischer Leitfaden für iOS/macOS-Entwickler
Entwurfsmuster (design patterns) sind bewährte Lösungen für typische Probleme in der Softwareentwicklung. Für iOS/macOS-Entwickler ist die Kenntnis von Swift-Entwurfsmustern eine unverzichtbare Fähigkeit, um skalierbare, testbare und wartbare Anwendungen zu erstellen. In diesem Artikel analysieren wir 4 Schlüsselmuster mit realen Codebeispielen.
1. Singleton (Einzelstück)
Eines der beliebtesten Muster in der iOS-Entwicklung. Es stellt sicher, dass eine Klasse nur eine einzige Instanz hat, und bietet einen globalen Zugriffspunkt darauf. Es wird zur Verwaltung gemeinsamer Ressourcen verwendet: UserDefaults, NetworkManager, Database.
Singleton-Implementierung in Swift
class NetworkManager { static let shared = NetworkManager() private init() { } func fetchData(from url: URL) { // Anfragelogik print("Daten empfangen von \\(url)") }}
// VerwendungNetworkManager.shared.fetchData(from: URL(string: "https://api.example.com")!)Wichtig: In Swift 5.5+ verwenden Sie actor für Threadsicherheit:
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 (Fabrikmethode)
Definiert eine Schnittstelle zur Erstellung von Objekten, ermöglicht es Unterklassen jedoch, den Typ der erstellten Objekte zu ändern. Ideal geeignet für die Erstellung verschiedener Arten von UI-Komponenten oder Datenmodellen.
Beispiel: Erstellung von Schaltflächen für verschiedene Plattformen
protocol Button { func render()}
class iOSButton: Button { func render() { print("Zeige iOS-Schaltfläche mit abgerundeten Ecken") }}
class macOSButton: Button { func render() { print("Zeige macOS-Schaltfläche mit Farbverlauf") }}
protocol ButtonFactory { func createButton() -> Button}
class iOSButtonFactory: ButtonFactory { func createButton() -> Button { return iOSButton() }}
class macOSButtonFactory: ButtonFactory { func createButton() -> Button { return macOSButton() }}
// Verwendunglet factory: ButtonFactory = iOSButtonFactory()let button = factory.createButton()button.render() // "Zeige iOS-Schaltfläche mit abgerundeten Ecken"3. Observer (Beobachter)
Ermöglicht es Objekten, Ereignisse zu abonnieren und Benachrichtigungen über Änderungen zu erhalten. In Swift wird es über NotificationCenter, Combine oder didSet implementiert.
Implementierung über 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("Temperatur geändert: \\(newTemp)°C") self?.updateUI(with: newTemp) } .store(in: &subscriptions) } private func updateUI(with temp: Double) { // Aktualisierung der Benutzeroberfläche }}Klassische Implementierung über ein Protokoll
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