En Objective-C, una notificación personalizada es simplemente un NSString simple, pero no es obvio en la versión WWDC de Swift 3 exactamente lo que debería ser.
112
En Objective-C, una notificación personalizada es simplemente un NSString simple, pero no es obvio en la versión WWDC de Swift 3 exactamente lo que debería ser.
Respuestas:
También puede utilizar un protocolo para esto
Y luego defina los nombres de sus notificaciones como un
enum
lugar que desee. Por ejemplo:Y usarlo como
De esta manera, los nombres de las notificaciones se desvincularán de la Fundación
Notification.Name
. Y solo tendrás que modificar tu protocolo en caso de que la implementaciónNotification.Name
cambie.fuente
NotificationName
que laname
propiedad solo se agregue a las enumeraciones que se ajustan al protocolo.extension NotificationName where Self: RawRepresentable, Self.RawValue == String {
Hay una forma más limpia (creo) de lograrlo
Y luego puedes usarlo así
fuente
extension NSNotification.Name
en lugar deextension Notification.Name
. De lo contrario, Swift 3 quejas con'Notification' is ambiguous for type lookup in this context
Notification.post se define como:
En Objective-C, el nombre de la notificación es un NSString simple. En Swift, se define como NSNotification.Name.
NSNotification.Name se define como:
Esto es un poco extraño, ya que esperaría que fuera un Enum, y no una estructura personalizada sin aparentemente más beneficio.
Hay un typealias en Notification for NSNotification.Name:
La parte confusa es que tanto Notification como NSNotification existen en Swift
Entonces, para definir su propia notificación personalizada, haga algo como:
Entonces para llamarlo:
fuente
Notification.Name
fuera una enumeración, nadie podría definir nuevas notificaciones. Usamos estructuras para tipos similares a enumeraciones que necesitan permitir agregar nuevos miembros. (Ver la propuesta de evolución rápida .)Notification
es un tipo de valor (una estructura), por lo que puede beneficiarse de la semántica de Swift para la (im) mutabilidad del valor. Por lo general, los tipos de base eliminan su "NS" en Swift 3, pero cuando existe uno de los nuevos tipos de valor de base para suplantarlo, el tipo de referencia anterior se mantiene (conservando el nombre "NS") para que pueda seguir utilizándolo cuando necesita semántica de referencia o subclasificarla. Vea la propuesta .Manera más fácil:
fuente
Puede agregar un inicializador personalizado a NSNotification.Name
Uso:
fuente
case
s en una enumeración deben estar en minúsculas, no la enumeración en sí. Los nombres de los tipos están en mayúsculas y las enumeraciones son tipos.Puedo sugerir otra opción similar a lo que sugirió @CesarVarela.
Esto te permitirá publicar y suscribirte a las notificaciones fácilmente.
Espero que esto te ayudará.
fuente
Hice mi propia implementación mezclando cosas de allí y de allí, y encontré esto como lo más conveniente. Compartiendo para quien pueda estar interesado:
fuente
fuente
Esto es solo una referencia
fuente
La ventaja de utilizar enumeraciones es que conseguimos que el compilador compruebe que el nombre es correcto. Reduce problemas potenciales y facilita la refactorización.
Para aquellos a los que les gusta usar enumeraciones en lugar de cadenas entre comillas para los nombres de notificación, este código funciona:
Entonces puedes usarlo así:
Aunque no está relacionado con la pregunta, se puede hacer lo mismo con las secuencias del guión gráfico, para evitar escribir cadenas entre comillas:
Luego, en su controlador de vista, llámelo como:
fuente
NotificationCenter.default.post(.somethingHappened)
Esto arroja un error; los métodos que agregaste en tu extensión aceptan más argumentos.si usa notificaciones personalizadas solo de cadena, no hay razón para extender ninguna clase, pero
String
fuente
La respuesta de @ CesarVarela es buena, pero para hacer que el código sea un poco más limpio, puede hacer lo siguiente:
fuente
Si desea que esto funcione de manera limpia en un proyecto que usa Objective-C y Swift al mismo tiempo, descubrí que es más fácil crear las notificaciones en Objective-C.
Cree un archivo .m / .h:
En su
MyProject-Bridging-Header.h
(nombre de su proyecto) para exponerlos a Swift.Use sus notificaciones en Objective-C de esta manera:
Y en Swift (5) así:
fuente