Entwurfsmuster in Swift: Fortgeschrittene Techniken und Beispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Fortgeschrittene Entwurfsmuster in Swift: Von der Theorie zur Praxis

Entwurfsmuster sind nicht nur abstrakte Konzepte, sondern bewährte Lösungen für wiederkehrende Aufgaben. Wenn Sie bereits grundlegende Muster (Singleton, Delegate, MVC) beherrschen und an komplexen iOS/macOS-Apps arbeiten, ist es Zeit für die nächste Stufe. In diesem Artikel behandeln wir vier fortgeschrittene Muster: Builder, Strategy, Observer (via Combine) und Coordinator. Jedes Muster wird mit echtem Swift-Code und Tipps zur Integration in bestehende Projekte veranschaulicht.



1. Builder – Flexible Konfiguration komplexer Objekte

Das Builder-Muster eignet sich ideal zum Erstellen von Objekten mit vielen optionalen Parametern. Statt langer Initialisierer mit Dutzenden von Parametern verwenden Sie eine schrittweise Konstruktion.

Beispiel: Konfiguration von UIAlertController

class AlertBuilder {    private var title: String?    private var message: String?    private var actions: [UIAlertAction] = []    private var preferredStyle: UIAlertController.Style = .alert

func setTitle(_ title: String) -> AlertBuilder { self.title = title return self }

func setMessage(_ message: String) -> AlertBuilder { self.message = message return self }

func addAction(title: String, style: UIAlertAction.Style = .default, handler: ((UIAlertAction) -> Void)? = nil) -> AlertBuilder { let action = UIAlertAction(title: title, style: style, handler: handler) actions.append(action) return self }

func setStyle(_ style: UIAlertController.Style) -> AlertBuilder { self.preferredStyle = style return self }

func build() -> UIAlertController { let alert = UIAlertController(title: title, message: message, preferredStyle: preferredStyle) actions.forEach { alert.addAction($0) } return alert }}

// Verwendunglet alert = AlertBuilder() .setTitle("Fehler") .setMessage("Daten konnten nicht geladen werden") .addAction(title: "OK", style: .default) .addAction(title: "Wiederholen", style: .cancel) .build()present(alert, animated: true)

Wann verwenden: beim Erstellen von Konfiguratoren, komplexen ViewControllern oder Datenmodellen mit vielen Optionen.



2. Strategy – Austausch von Algorithmen zur Laufzeit

Das Strategy-Muster ermöglicht es, eine Familie von Algorithmen zu kapseln und austauschbar zu machen. Dies ist besonders nützlich für Zahlungsabwicklung, Datenvalidierung oder Rendering.

Beispiel: Inhaltsfiltersystem

protocol FilterStrategy {    func apply(to items: [String]) -> [String]}

class AlphabeticalFilter: FilterStrategy { func apply(to items: [String]) -> [String] { return items.sorted() }}

class LengthFilter: FilterStrategy { func apply(to items: [String]) -> [String] { return items.filter { $0.count > 5 } }}

class ContentManager { private var strategy: FilterStrategy

init(strategy: FilterStrategy) { self.strategy = strategy }

func setStrategy(_ strategy: FilterStrategy) { self.strategy = strategy }

func filter(items: [String]) -> [String] { return strategy.apply(to: items) }}

// Verwendunglet manager = ContentManager(strategy: AlphabeticalFilter())let data = ["Swift", "Objective-C", "Kotlin", "Java", "Python"]print(manager.filter(items: data)) // ["Java", "Kotlin", "Objective-C", "Python", "Swift"]

manager.setStrategy(LengthFilter())print(manager.filter(items: data)) // ["Objective-C", "Python"]

Tipp: Kombinieren Sie Strategy mit einer Factory-Methode, um die Strategie basierend auf Benutzereinstellungen auszuwählen.



3. Observer via Combine – Re

Blogs

Buchempfehlungen