Swift Academy · Lektion

Alternativ till Observer Pattern

Jämför med delegates och Combine-publishers.

Lektion 4 av 413 steg

Alternativ till Observer Pattern är en gratis lektion i Swift Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Swift Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Swift Academy innehåller totalt 4 lektioner.

Alternativ till observatörsmönstret

NotificationCenter är ett sätt att reagera på händelser. Swift erbjuder andra: delegation, Combine och asynkrona strömmar. Var och en passar en viss typ av kommunikation.

Observatörsmönstret

Observatörsmönstret låter objekt prenumerera på händelser från ett subjekt. NotificationCenter är en global och löst kopplad implementering av mönstret.

import Foundation

// Subject posts, observers react, neither holds the other.
NotificationCenter.default.post(name: Notification.Name("tick"), object: nil)
print("Broadcast an event")

Delegation

En delegate är en en-till-en-koppling: ett objekt vidarebefordrar specifika händelser till en enda delegate via ett protokoll. Den är explicit och typsäker.

protocol DownloadDelegate: AnyObject {
    func didFinish(_ bytes: Int)
}
class Downloader {
    weak var delegate: DownloadDelegate?
    func finish() { delegate?.didFinish(1024) }
}
print("Delegate is one-to-one and typed")

Delegate kontra notis

Använd en delegate när exakt ett objekt är intresserat och relationen är tydlig. Använd NotificationCenter när många okända observatörer kan reagera.

import Foundation

// One listener -> delegate. Many/unknown listeners -> NotificationCenter.
print("Cardinality guides the choice")

Combine-publicerare

Combine modellerar händelser som publishers som du prenumererar på med sink, och stöder transformeringsoperatorer som map och filter.

import Combine

let subject = PassthroughSubject<Int, Never>()
let c = subject.sink { print("Got \($0)") }
subject.send(5)
_ = c

NotificationCenter-publicerare

Combine kopplar ihop NotificationCenter med Combine: publisher(for:) omvandlar notiser till en ström som du kan transformera.

import Foundation
import Combine

let name = Notification.Name("ping")
let c = NotificationCenter.default.publisher(for: name)
    .sink { _ in print("Combine got notification") }
NotificationCenter.default.post(name: name, object: nil)
_ = c

Combine-operatorer

Styrkan i Combine är att komponera händelsepipelines: filtrera, debounce, kombinera och mappa värden deklarativt.

import Combine

let subject = PassthroughSubject<Int, Never>()
let c = subject
    .filter { $0 > 0 }
    .map { $0 * 2 }
    .sink { print($0) }
subject.send(-1)
subject.send(3)
_ = c

Asynkrona sekvenser

Modern Swift erbjuder AsyncStream och asynkrona sekvenser för notiser, så att du kan konsumera händelser med for await i strukturerad samtidighet.

import Foundation

func listen() async {
    let name = Notification.Name("ping")
    for await _ in NotificationCenter.default.notifications(named: name) {
        print("Async observed")
        break
    }
}
print("Can await notifications")

Closures och callbacks

För en enda lokal callback är en lagrad closure enklast, utan någon observatörsmekanik alls.

struct Button {
    var onTap: () -> Void
    func tap() { onTap() }
}
Button(onTap: { print("tapped") }).tap()

Välja en metod

Delegate: en-till-en, explicit. NotificationCenter: många-till-många, frikopplat. Combine/async: strömmar som behöver transformering. Closure: enkla lokala callbacks.

import Foundation

// Match the tool to the communication shape.
print("Delegate, Notification, Combine, async, closure")

Avvägningar

NotificationCenter är flexibelt men otypat och lätt att orsaka läckor med. Delegation och Combine är typsäkra; Combine och async ger mer kraft på bekostnad av fler koncept.

import Foundation

// Prefer typed approaches when the relationship is known.
print("Type safety vs flexibility tradeoff")

Snabb kontroll

Vilken mekanism passar bäst för en tydlig, typsäker en-till-en-relation?

Sammanfattning

Observatörsmönstret har flera former i Swift: NotificationCenter för frikopplade många-till-många-händelser, delegation för typade en-till-en-kopplingar, Combine och asynkrona sekvenser för komponerbara strömmar samt closures för enkla callbacks. Välj utifrån kommunikationsform och behov av typsäkerhet. Därmed är kursen slutförd.

Gratis att börja

Lär dig Swift med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
122
Lektioner
409

Vanliga frågor

Är lektionen ”Alternativ till Observer Pattern” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Swift Academy, inklusive ”Alternativ till Observer Pattern”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Swift Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Alternativ till Observer Pattern”?

Jämför med delegates och Combine-publishers. Ni övar på Swift Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Swift Academy?

Du behöver inga förkunskaper. Utbildningen i Swift Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Alternativ till Observer Pattern”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Swift Academy-lektionen?

Ja. Varje Swift Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Publicera och observera notiser
  2. Notification userInfo-payloads
  3. Ta bort observatörer säkert
  4. Alternativ till Observer Pattern
← Tillbaka till Swift Academy