В Objective-C настраиваемое уведомление - это просто NSString, но в версии Swift 3 для WWDC неочевидно, каким оно должно быть.
112
В Objective-C настраиваемое уведомление - это просто NSString, но в версии Swift 3 для WWDC неочевидно, каким оно должно быть.
Ответы:
Вы также можете использовать протокол для этого
А затем определите свои имена уведомлений как
enum
угодно. Например:И используйте это как
Таким образом, имена уведомлений будут отделены от Foundation
Notification.Name
. И вам останется только изменить свой протокол в случае реализацииNotification.Name
изменений.источник
NotificationName
поэтомуname
свойство добавляется только к перечислениям , которые соответствуют протоколу.extension NotificationName where Self: RawRepresentable, Self.RawValue == String {
Есть более чистый (я думаю) способ добиться этого
И тогда вы можете использовать это так
источник
extension NSNotification.Name
вместоextension Notification.Name
. В противном случае жалобы на Swift 3 с'Notification' is ambiguous for type lookup in this context
Notification.post определяется как:
В Objective-C имя уведомления - это простая строка NSString. В Swift он определяется как NSNotification.Name.
NSNotification.Name определяется как:
Это немного странно, поскольку я ожидал, что это будет Enum, а не какая-то настраиваемая структура, которая, по-видимому, не имеет больше преимуществ.
В Notification for NSNotification.Name есть typealias:
Непонятная часть заключается в том, что в Swift существуют как Notification, так и NSNotification.
Итак, чтобы определить собственное уведомление, сделайте что-нибудь вроде:
Затем назвать это:
источник
Notification.Name
было перечисление, никто бы не смог определять новые уведомления. Мы используем структуры для типов, подобных перечислению, которые должны разрешать добавление новых членов. (См. Предложение о быстрой эволюции .)Notification
это тип значения (а структура), так что он может извлечь выгоду из семантики Свифта для значения (им) изменчивости. Как правило, типы Foundation удаляют свои "NS" в Swift 3, но там, где существует один из новых типов значений Foundation для его замены, старый ссылочный тип остается (сохраняя имя "NS"), так что вы все еще можете использовать его, когда вам нужна эталонная семантика или ее подкласс. Смотрите предложение .Более простой способ:
источник
Вы можете добавить собственный инициализатор в NSNotification.Name
Использование:
источник
case
нижнем регистре должны быть только s в перечислении, а не само перечисление. Имена типов пишутся в верхнем регистре, а перечисления - это типы.Я могу предложить другой вариант, аналогичный тому, что предлагал @CesarVarela.
Это позволит вам легко публиковать и подписываться на уведомления.
Надеюсь, что это поможет вам.
источник
Я сделал свою собственную реализацию, смешивая вещи оттуда и там, и считаю это наиболее удобным. Поделитесь тем, кто может быть заинтересован:
источник
источник
Это просто ссылка
источник
Преимущество использования перечислений заключается в том, что мы заставляем компилятор проверять правильность имени. Уменьшает потенциальные проблемы и упрощает рефакторинг.
Для тех, кто любит использовать перечисления вместо строк в кавычках для имен уведомлений, этот код поможет:
Тогда вы можете использовать это так:
Хотя это не связано с вопросом, то же самое можно сделать с сегментами раскадровки, чтобы не вводить строки в кавычках:
Затем на вашем контроллере представления назовите его так:
источник
NotificationCenter.default.post(.somethingHappened)
Это вызывает ошибку; методы, которые вы добавили в свое расширение, принимают больше аргументов.если вы используете настраиваемые уведомления, состоящие только из строк, нет причин для расширения каких-либо классов, кроме
String
источник
@ CesarVarela ответ хорош, но чтобы сделать код немного чище, вы можете сделать следующее:
источник
Если вы хотите, чтобы это работало чисто в проекте, который одновременно использует Objective-C и Swift, я обнаружил, что проще создавать уведомления в Objective-C.
Создайте файл .m / .h:
В вашем
MyProject-Bridging-Header.h
(названном в честь вашего проекта), чтобы открыть их для Swift.Используйте свои уведомления в Objective-C следующим образом:
А в Swift (5) вот так:
источник