Entwurfsmuster in Swift: Von der Theorie zur Praxis
Entwurfsmuster sind bewährte Lösungen für typische Aufgaben in der Entwicklung. Für einen iOS-Entwickler mit Swift ist die Beherrschung von Entwurfsmustern nicht nur ein Plus im Lebenslauf, sondern eine Notwendigkeit. Sie helfen, sauberen, wiederverwendbaren und testbaren Code zu schreiben. In diesem Artikel analysieren wir 5 Schlüsselmuster mit realen Beispielen in Swift.
1. Singleton (Einzelstück)
Eines der beliebtesten Muster in iOS. Es stellt sicher, dass eine Klasse nur eine Instanz hat, und bietet einen globalen Zugriffspunkt darauf.
Implementierung in Swift
class NetworkManager { static let shared = NetworkManager() private init() {} // verhindert die Erstellung weiterer Instanzen
func requestData(from url: URL) { // Logik der Anfrage print("Anfrage an \\(url.absoluteString)") }}
// VerwendungNetworkManager.shared.requestData(from: URL(string: "https://api.example.com")!)Wann verwenden: zur Verwaltung gemeinsamer Ressourcen (Netzwerk, Datenbank, UserDefaults). Nachteil: erschwert das Unit-Testing, daher sollte man es nicht übermäßig nutzen.
2. Factory Method (Fabrikmethode)
Definiert eine Schnittstelle zur Erstellung eines Objekts, ermöglicht es Unterklassen jedoch, den Typ des erstellten Objekts zu ändern. Ideal geeignet, wenn im Voraus nicht bekannt ist, welches Objekt genau benötigt wird.
Beispiel: Erstellung von UI-Elementen
protocol Button { func render()}
class iOSButton: Button { func render() { print("Button im iOS-Stil") }}
class macOSButton: Button { func render() { print("Button im macOS-Stil") }}
enum Platform { case iOS, macOS}
class ButtonFactory { static func createButton(for platform: Platform) -> Button { switch platform { case .iOS: return iOSButton() case .macOS: return macOSButton() } }}
// Verwendunglet button = ButtonFactory.createButton(for: .iOS)button.render() // Button im iOS-Stil3. Observer (Beobachter)
Ermöglicht es Objekten, Ereignisse zu abonnieren und Benachrichtigungen über Änderungen zu erhalten. In Swift nativ über NotificationCenter und Combine implementiert.
Beispiel mit NotificationCenter
extension Notification.Name { static let userDidLogin = Notification.Name("userDidLogin")}
class AuthManager { func login() { // Logik des Logins 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("Profil nach Login aktualisieren") }
deinit { NotificationCenter.default.removeObserver(self) }}Moderne Alternative: Verwenden Sie Combine (iOS 13+) mit @Published und PassthroughSubject für reaktive Programmierung.
4. Delegate (Delegat)
Eines der grundlegenden Muster von Cocoa Touch. Es ermöglicht einem Objekt, die Ausführung von Aufgaben an ein anderes zu delegieren. Wird häufig in UIKit verwendet (z.B. UITableViewDelegate).
Erstellung eines eigenen Delegaten
protocol DownloadDelegate: AnyObject { func didFinishDownloading(data: Data) func didFailWithError(error: Error)}
class Downloader { weak var delegate: DownloadDelegate?
func download(from url: URL) { // Simulation des Downloads let data = Data() delegate?.didFinishDownloading(data: data) }}
class ViewController: UIViewController, DownloadDelegate { let downloader = Downloader()
override fu