Полезные данные уведомлений userInfo
Прикрепляйте типизированные данные к уведомлениям.
«Полезные данные уведомлений userInfo» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
userInfo уведомления
Уведомление может содержать данные в словаре userInfo, благодаря чему наблюдатели получают подробности о произошедшем.
Отправка с userInfo
Передайте словарь в post(name:object:userInfo:). Keys и значения имеют тип Any, поэтому подойдёт любая полезная нагрузка.
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("scoreChanged")
center.post(name: name, object: nil, userInfo: ["score": 100])
print("Posted with payload")Чтение userInfo
В наблюдателе прочитайте notification.userInfo и приведите значение к ожидаемому типу.
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])Несколько значений
Словарь может содержать несколько ключей, объединяя связанные данные.
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])Типобезопасные ключи
Использование ключей-строковых литералов чревато ошибками. Определяйте константы, чтобы избежать несоответствий между отправителем и наблюдателем.
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")Осторожное приведение типов
Поскольку значения имеют тип Any, приведение может завершиться неудачей. Используйте условную привязку, чтобы неправильный тип не вызвал сбой.
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")
}Пользовательские структуры как полезная нагрузка
Вы можете сохранить целую структуру как значение, а затем снова привести его к нужному типу, сохранив строгую типизацию полезной нагрузки.
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)")
}Обёртка для отправки
Вспомогательная функция, создающая userInfo, обеспечивает единообразное формирование полезной нагрузки во всём приложении.
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")Обёртка для чтения
Дополните вспомогательную функцию типизированным средством доступа, чтобы наблюдателям не приходилось повторять логику приведения типов.
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)Значения по умолчанию и отсутствующие ключи
Если ключ отсутствует, результат приведения равен nil. Задайте разумное значение по умолчанию с помощью оператора объединения с nil.
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)")Не увеличивайте полезную нагрузку
userInfo лучше всего подходит для небольших сериализуемых данных. Для крупных объектов передавайте идентификатор, а остальное позволяйте наблюдателям получать самостоятельно.
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")Быстрая проверка
Какой тип имеют значения, хранящиеся в словаре userInfo уведомления?
Повторение
Словарь userInfo содержит данные уведомления в виде значений типа Any, поэтому наблюдатели должны осторожно выполнять приведение типов. Используйте постоянные ключи, вспомогательные функции и типизированные средства доступа, задавайте значения по умолчанию для отсутствующих ключей и не увеличивайте полезную нагрузку. Далее: безопасное удаление наблюдателей.
Часто задаваемые вопросы
Урок «Полезные данные уведомлений userInfo» бесплатный?
Да — полный текст урока «Полезные данные уведомлений userInfo» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «Полезные данные уведомлений userInfo»?
Прикрепляйте типизированные данные к уведомлениям. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Полезные данные уведомлений userInfo»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Публикация и наблюдение за уведомлениями
- Полезные данные уведомлений userInfo
- Безопасное удаление наблюдателей
- Альтернативы шаблону наблюдателя