Em Objective-C, uma notificação personalizada é apenas um NSString simples, mas não é óbvio na versão WWDC do Swift 3 exatamente o que deveria ser.
112
Em Objective-C, uma notificação personalizada é apenas um NSString simples, mas não é óbvio na versão WWDC do Swift 3 exatamente o que deveria ser.
Respostas:
Você também pode usar um protocolo para este
Em seguida, defina seus nomes de notificação como em
enum
qualquer lugar que desejar. Por exemplo:E usar como
Desta forma, os nomes das notificações serão dissociados da Fundação
Notification.Name
. E você só terá que modificar seu protocolo no caso da implementação paraNotification.Name
alterações.fonte
NotificationName
que oname
propriedade só seja adicionada às enums que estão em conformidade com o protocolo.extension NotificationName where Self: RawRepresentable, Self.RawValue == String {
Existe uma maneira mais limpa (eu acho) de conseguir isso
E então você pode usá-lo assim
fonte
extension NSNotification.Name
em vez deextension Notification.Name
. Caso contrário, Swift 3 reclama com'Notification' is ambiguous for type lookup in this context
Notification.post é definido como:
Em Objective-C, o nome da notificação é um NSString simples. Em Swift, é definido como NSNotification.Name.
NSNotification.Name é definido como:
Isso é meio estranho, já que eu esperava que fosse um Enum, e não uma estrutura personalizada com aparentemente nenhum benefício.
Há um typealias em Notification for NSNotification.Name:
A parte confusa é que tanto a Notificação quanto a NSNotification existem no Swift
Portanto, para definir sua própria notificação personalizada, faça algo como:
Então, para chamá-lo:
fonte
Notification.Name
fosse um enum, ninguém seria capaz de definir novas notificações. Usamos structs para tipos do tipo enum que precisam permitir a adição de novos membros. (Veja a proposta de evolução rápida .)Notification
é um tipo de valor (uma estrutura), de modo que pode se beneficiar da semântica do Swift para (im) mutabilidade de valor. Geralmente, os tipos de base estão perdendo seus "NS" no Swift 3, mas onde um dos novos Tipos de valor de base existe para substituí-lo, o tipo de referência antigo permanece (mantendo o nome "NS") para que você ainda possa usá-lo quando você precisa de semântica de referência ou subclasse. Veja a proposta .Maneira mais fácil:
fonte
Você pode adicionar um inicializador personalizado a NSNotification.Name
Uso:
fonte
case
s em um enum deve ser minúsculo, não o próprio enum. Nomes de tipo são maiúsculos e enums são tipos.Posso sugerir outra opção semelhante à sugerida por @CesarVarela.
Isso permitirá que você poste e se inscreva em notificações facilmente.
Espero que isso ajude você.
fonte
Fiz minha própria implementação misturando coisas de lá e de lá, e achei isso o mais conveniente. Compartilhando para quem possa estar interessado:
fonte
fonte
Isso é apenas referência
fonte
A vantagem de usar enums é que fazemos com que o compilador verifique se o nome está correto. Reduz possíveis problemas e facilita a refatoração.
Para quem gosta de usar enums em vez de strings entre aspas para nomes de notificação, este código funciona:
Então você pode usá-lo assim:
Embora não relacionado à pergunta, o mesmo pode ser feito com segues de storyboard, para evitar digitar strings entre aspas:
Então, em seu controlador de visualização, chame-o assim:
fonte
NotificationCenter.default.post(.somethingHappened)
Isso gera um erro; os métodos que você adicionou em sua extensão aceitam mais argumentos.se você usar notificações personalizadas apenas de string, não há razão para estender nenhuma classe, mas
String
fonte
A resposta da @CesarVarela é boa, mas para deixar o código um pouco mais limpo, você pode fazer o seguinte:
fonte
Se você quiser que isso funcione de forma limpa em um projeto que usa Objective-C e Swift ao mesmo tempo, achei mais fácil criar as notificações em Objective-C.
Crie um arquivo .m / .h:
Em seu
MyProject-Bridging-Header.h
(nome de seu projeto) para expô-los ao Swift.Use suas notificações em Objective-C assim:
E em Swift (5) assim:
fonte