0Pricing
Swift Academy · Lekcja

Ładunki userInfo powiadomień

Dołączanie typowanych danych do powiadomień.

Ładunki userInfo powiadomień to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

userInfo powiadomienia

Powiadomienie może przenosić dane w swoim słowniku userInfo, dzięki czemu obserwatorzy otrzymują szczegóły dotyczące tego, co się wydarzyło.

Wysyłanie z userInfo

Przekaż słownik do post(name:object:userInfo:). Klucze i wartości mają typ Any, więc można w nim umieścić dowolne dane.

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("scoreChanged")
center.post(name: name, object: nil, userInfo: ["score": 100])
print("Posted with payload")

Odczytywanie userInfo

W obserwatorze odczytaj notification.userInfo i wykonaj rzutowanie na oczekiwany typ.

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("scoreChanged")
_ = center.addObserver(forName: name, object: nil, queue: nil) { note in
    if let score = note.userInfo?["score"] as? Int {
        print("Score: \(score)")
    }
}
center.post(name: name, object: nil, userInfo: ["score": 42])

Wiele wartości

Słownik może zawierać kilka kluczy, umożliwiając przechowywanie powiązanych danych w jednym miejscu.

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("login")
_ = center.addObserver(forName: name, object: nil, queue: nil) { note in
    let user = note.userInfo?["user"] as? String ?? "?"
    let admin = note.userInfo?["admin"] as? Bool ?? false
    print("\(user) admin=\(admin)")
}
center.post(name: name, object: nil, userInfo: ["user": "ada", "admin": true])

Klucze bezpieczne typowo

Używanie kluczy będących literałami tekstowymi jest podatne na błędy. Zdefiniuj stałe, aby uniknąć niezgodności między nadawcą a obserwatorem.

import Foundation

enum Keys { static let amount = "amount" }
let center = NotificationCenter.default
let name = Notification.Name("purchase")
center.post(name: name, object: nil, userInfo: [Keys.amount: 9.99])
print("Used a constant key")

Ostrożne rzutowanie

Ponieważ wartości mają typ Any, rzutowanie może się nie udać. Użyj opcjonalnego wiązania, aby nieprawidłowy typ nie spowodował awarii.

import Foundation

let note = Notification(name: Notification.Name("x"), object: nil, userInfo: ["n": "oops"])
if let n = note.userInfo?["n"] as? Int {
    print(n)
} else {
    print("Wrong type, handled safely")
}

Własne struktury jako dane

Możesz przechować całą strukturę jako wartość, a następnie wykonać rzutowanie z powrotem na jej typ, zachowując silne typowanie danych.

import Foundation

struct Event { let id: Int }
let note = Notification(name: Notification.Name("e"), object: nil, userInfo: ["event": Event(id: 7)])
if let e = note.userInfo?["event"] as? Event {
    print("Event id: \(e.id)")
}

Opakowanie wysyłania

Funkcja pomocnicza, która tworzy userInfo, zapewnia spójny sposób konstruowania danych w całej aplikacji.

import Foundation

let name = Notification.Name("progress")
func postProgress(_ value: Int) {
    NotificationCenter.default.post(name: name, object: nil, userInfo: ["value": value])
}
postProgress(75)
print("Posted progress")

Opakowanie odczytu

Połącz funkcję pomocniczą z akcesorem o określonym typie, aby obserwatory nie powtarzały logiki rzutowania.

import Foundation

extension Notification {
    var progressValue: Int? { userInfo?["value"] as? Int }
}
let n = Notification(name: Notification.Name("progress"), object: nil, userInfo: ["value": 50])
print(n.progressValue ?? -1)

Wartości domyślne a brakujące klucze

Jeśli klucz nie istnieje, rzutowanie zwraca nil. Użyj operatora łączenia z nil, aby zapewnić rozsądną wartość domyślną.

import Foundation

let n = Notification(name: Notification.Name("y"), object: nil, userInfo: [:])
let count = n.userInfo?["count"] as? Int ?? 0
print("Count defaulted to \(count)")

Dane powinny być niewielkie

userInfo najlepiej nadaje się do niewielkich, możliwych do zserializowania danych. W przypadku dużych obiektów przekaż identyfikator i pozwól obserwatorom pobrać resztę danych.

import Foundation

let name = Notification.Name("itemUpdated")
// Send just an id, not a heavy object graph.
NotificationCenter.default.post(name: name, object: nil, userInfo: ["id": 1234])
print("Posted a lightweight payload")

Szybkie sprawdzenie

Jakiego typu są wartości przechowywane w słowniku userInfo powiadomienia?

Podsumowanie

Słownik userInfo przenosi dane powiadomienia jako wartości typu Any, dlatego obserwatorzy muszą ostrożnie wykonywać rzutowanie. Używaj stałych kluczy, funkcji pomocniczych i akcesorów o określonych typach, zapewniaj wartości domyślne dla brakujących kluczy i przechowuj niewielkie dane. Następnie: bezpieczne usuwanie obserwatorów.

Często zadawane pytania

Czy lekcja „Ładunki userInfo powiadomień” jest bezpłatna?

Tak — pełny tekst „Ładunki userInfo powiadomień” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Ładunki userInfo powiadomień”?

Dołączanie typowanych danych do powiadomień. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Ładunki userInfo powiadomień”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Publikowanie i obserwowanie powiadomień
  2. Ładunki userInfo powiadomień
  3. Bezpieczne usuwanie obserwatorów
  4. Alternatywy dla wzorca Observer
← Powrót do Swift Academy