En Objective-C, une notification personnalisée n'est qu'une simple NSString, mais ce n'est pas évident dans la version WWDC de Swift 3 exactement ce qu'elle devrait être.
112
En Objective-C, une notification personnalisée n'est qu'une simple NSString, mais ce n'est pas évident dans la version WWDC de Swift 3 exactement ce qu'elle devrait être.
Réponses:
Vous pouvez également utiliser un protocole pour cela
Et puis définissez vos noms de notification comme
enum
vous le souhaitez. Par exemple:Et utilisez-le comme
De cette façon, les noms des notifications seront découplés de la Fondation
Notification.Name
. Et vous n'aurez qu'à modifier votre protocole en cas de mise en œuvre pour desNotification.Name
changements.la source
NotificationName
que laname
propriété ne soit ajoutée qu'aux énumérations conformes au protocole.extension NotificationName where Self: RawRepresentable, Self.RawValue == String {
Il existe un moyen plus propre (je pense) d'y parvenir
Et puis tu peux l'utiliser comme ça
la source
extension NSNotification.Name
au lieu deextension Notification.Name
. Sinon Swift 3 plaintes avec'Notification' is ambiguous for type lookup in this context
Notification.post est défini comme:
En Objective-C, le nom de la notification est une NSString simple. Dans Swift, il est défini comme NSNotification.Name.
NSNotification.Name est défini comme:
C'est un peu bizarre, car je m'attendrais à ce que ce soit un Enum, et non une structure personnalisée avec apparemment aucun avantage.
Il existe un typealias dans Notification for NSNotification.Name:
La partie déroutante est que la notification et la NSNotification existent dans Swift
Donc, pour définir votre propre notification personnalisée, faites quelque chose comme:
Alors pour l'appeler:
la source
Notification.Name
s'agissait d'une énumération, personne ne pourrait définir de nouvelles notifications. Nous utilisons des structures pour les types de type autrement enum qui doivent permettre l'ajout de nouveaux membres. (Voir la proposition d'évolution rapide .)Notification
est un type valeur (une structure), de sorte qu'il puisse bénéficier de la sémantique de Swift pour la (im) mutabilité de la valeur. Généralement, les types Foundation abandonnent leur "NS" dans Swift 3, mais là où l'un des nouveaux types de valeur Foundation existe pour le remplacer, l'ancien type de référence reste (en conservant le nom "NS") afin que vous puissiez toujours l'utiliser lorsque vous avez besoin d'une sémantique de référence ou de la sous-classer. Voir la proposition .Manière plus simple:
la source
Vous pouvez ajouter un initialiseur personnalisé à NSNotification.Name
Usage:
la source
case
s dans une énumération doivent être en minuscules, pas l'énumération elle-même. Les noms de type sont en majuscules et les énumérations sont des types.Je peux suggérer une autre option qui est similaire à ce que @CesarVarela a suggéré.
Cela vous permettra de publier et de vous abonner facilement aux notifications.
J'espère que ceci vous aidera.
la source
J'ai fait ma propre implémentation en mélangeant les choses à partir de là et de là, et je trouve que c'est la plus pratique. Partage pour ceux qui pourraient être intéressés:
la source
la source
C'est juste une référence
la source
L'avantage d'utiliser des enums est que nous demandons au compilateur de vérifier que le nom est correct. Réduit les problèmes potentiels et facilite la refactorisation.
Pour ceux qui aiment utiliser des énumérations au lieu de chaînes entre guillemets pour les noms de notification, ce code fait l'affaire:
Ensuite, vous pouvez l'utiliser comme ceci:
Bien que sans rapport avec la question, la même chose peut être faite avec les séquences de storyboard, pour éviter de taper des chaînes entre guillemets:
Ensuite, sur votre contrôleur de vue, appelez-le comme:
la source
NotificationCenter.default.post(.somethingHappened)
Cela génère une erreur; les méthodes que vous avez ajoutées dans votre extension acceptent plus d'arguments.si vous utilisez des notifications personnalisées contenant uniquement des chaînes, il n'y a aucune raison d'étendre les classes mais
String
la source
La réponse de @ CesarVarela est bonne, mais pour rendre le code légèrement plus propre, vous pouvez faire ce qui suit:
la source
Si vous souhaitez que cela fonctionne correctement dans un projet qui utilise à la fois Objective-C et Swift en même temps, j'ai trouvé qu'il était plus facile de créer les notifications dans Objective-C.
Créez un fichier .m / .h:
Dans votre
MyProject-Bridging-Header.h
(nommé d'après votre projet) pour les exposer à Swift.Utilisez vos notifications dans Objective-C comme ceci:
Et dans Swift (5) comme ceci:
la source