Предотвращение принудительной распаковки в рамках Swift Combine - PullRequest
2 голосов
/ 22 июня 2019

В видео 721 WWDC 2019 основа основного примера начинается следующим образом:

let trickNamePublisher = NotificationCenter.default.publisher(for: .newTrickDownloaded)
    .map { notification in
        return notification.userInfo?["data"] as! Data
    }

Это кажется нецелесообразным.Что происходит, если нет userInfo, или в нем нет ключа "data", или это не Данные?Мы принудительно развернем nil и рухнем.Какая лучшая практика здесь?

1 Ответ

5 голосов
/ 22 июня 2019

Используйте compactMap вместо:

let trickNamePublisher = NotificationCenter.default.publisher(for: .newTrickDownloaded)
    .compactMap { $0.userInfo?["data"] as? Data }

Если наше закрытие создает дополнительные данные, оно разворачивается, и мы публикуем данные. Если наше закрытие выдает nil, ничего не происходит (ничего не публикуется).

(Удивительно, что видео так не пишет. В защиту Apple, как указывают MartinR и Итай Фербер, в видео предполагается, что мы сами публикуем уведомление, поэтому мы точно знаем, что находится у пользователя Развертывание информации и принудительное развертывание является разумным. Этот вопрос и ответ сфокусированы на общей ситуации, когда вы подписались на уведомление от фреймворка, такого как Cocoa. Кроме того, я не могу поверить, что это когда-либо плохо Идея безопасно развернуть, в моем собственном коде, до фреймворка Combine, я всегда безопасно распаковывал userInfo значений, даже когда сам отправляю уведомление.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...