0Pricing
Swift Academy · Урок

Полезные данные уведомлений 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 — локальная установка не требуется.

Все уроки этого курса

  1. Публикация и наблюдение за уведомлениями
  2. Полезные данные уведомлений userInfo
  3. Безопасное удаление наблюдателей
  4. Альтернативы шаблону наблюдателя
← Назад к Swift Academy