Entwurfsmuster in Swift mit Beispielen: von A bis Z

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

Entwurfsmuster in Swift: von den Grundlagen bis zur Praxis



Entwurfsmuster (Design Patterns) sind bewährte Lösungen für typische Entwicklungsaufgaben. In der Welt von Swift und dem Apple-Ökosystem (iOS/macOS) ist ihre Kenntnis unerlässlich, um wartbaren, testbaren und skalierbaren Code zu erstellen. In diesem Artikel analysieren wir die wichtigsten Muster und unterteilen sie in drei Hauptkategorien: Erzeugungs-, Struktur- und Verhaltensmuster. Jedes Muster wird mit einem funktionierenden Beispiel in Swift veranschaulicht.



Erzeugungsmuster: Singleton, Factory Method und Builder



Erzeugungsmuster sind für den Prozess der Objekterstellung verantwortlich und machen diesen flexibler und unabhängiger vom Client-Code.



Singleton (Einzelstück)

Garantiert, dass eine Klasse nur eine Instanz hat, und bietet einen globalen Zugriffspunkt darauf. In iOS wird es häufig für die Verwaltung von Netzwerksitzungen, Datenbanken (Core Data) oder App-Einstellungen verwendet.

class NetworkManager {    static let shared = NetworkManager()    private init() {}        func fetchData(from url: URL) {        // Logik der Anfrage        print("Fetching data from \\(url)")    }}

// VerwendungNetworkManager.shared.fetchData(from: URL(string: "https://example.com")!)


Factory Method (Fabrikmethode)

Definiert eine Schnittstelle zum Erstellen eines Objekts, ermöglicht es Unterklassen jedoch, den Typ des erstellten Objekts zu ändern. Ideal geeignet für die Erstellung von UI-Komponenten in Abhängigkeit von der iOS-Version oder Konfiguration.

protocol Button {    func render()}

class iOSButton: Button { func render() { print("Rendering iOS button") }}

class macOSButton: Button { func render() { print("Rendering macOS button") }}

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()


Builder (Erbauer)

Ermöglicht die schrittweise Erstellung komplexer Objekte. Wird häufig für die Konfiguration von Anfragen (URLRequest) oder komplexen UI-Einstellungen verwendet.

class Pizza {    var dough: String = ""    var cheese: String = ""    var toppings: [String] = []}

class PizzaBuilder { private var pizza = Pizza() func setDough(_ dough: String) -> PizzaBuilder { pizza.dough = dough return self } func setCheese(_ cheese: String) -> PizzaBuilder { pizza.cheese = cheese return self } func addTopping(_ topping: String) -> PizzaBuilder { pizza.toppings.append(topping) return self } func build() -> Pizza { return pizza }}

// Verwendunglet margherita = PizzaBuilder() .setDough("Thin") .setCheese("Mozzarella") .addTopping("Basil") .build()


Strukturmuster: Adapter, Decorator und Facade



Strukturmuster vereinfachen das Design, indem sie Möglichkeiten definieren, Objekte und Klassen zu größeren Strukturen zusammenzufassen.



Adapter (Adapter)

Ermöglicht Objekten mit inkompatiblen Schnittstellen die Zusammenarbeit. Ein klassisches Beispiel ist die Integration von Drittanbieter-Bibliotheken oder die Arbeit mit Legacy-Code.

// Altes Protokollprotocol OldPaymentSystem {    func pay(amount: Double)}

// Neues Protokollprotocol NewPaymentSystem { func processPayment(amount: Double, currency: String)}

// Adapterclass PaymentAdapter: NewPaymentSystem { private let oldSystem: OldPaymentSystem init(oldSystem: OldPaymentSystem) { self.oldSystem = oldSystem } func processPayment(amount: Double, currency: String) { // Währungsumrechnung let convertedAmount = amount * 1.1 oldSy

Blogs

Buchempfehlungen