Ł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
- Publikowanie i obserwowanie powiadomień
- Ładunki userInfo powiadomień
- Bezpieczne usuwanie obserwatorów
- Alternatywy dla wzorca Observer