Notification.Name
n'existe pas dans Objective-C. Et le type Objective-C NotificationName
est vraiment juste un NSString
. Pour utiliser Swift en Objective-C, la classe doit être disponible dans les deux, et ne peut pas être une structure Swift (comme Notification
ou String
, par exemple).
Pour faire ce que vous voulez, alors, vous devez avoir deux extensions:
- un pour le Swift
Notification.Name
, que vous avez; et,
- un pour un objet Objective-C (
NSString
, disons, ou peut-être NSNotification
si vous préférez).
1) Ajouter un objet compatible avec Objective-C extension de votre fichier Swift:
public extension NSNotification {
public static let blahblahblah: NSString = "blahblahblah"
}
Note: Swift 4, properties must be computed pour la compatibilité Objective-C. Cela ressemblerait à ceci:
public extension NSNotification {
public static var blahblahblah: NSString {
return "blahblahblah"
}
}
Notez le var
dans la propriété calculée: Les propriétés calculées ne peuvent pas être immuable, ne peut donc pas utiliser let
.
2) Dans le fichier Objective-C, le fichier d'en-tête Swift généré par l'importation Xcode (ci-dessous toute autre importation):
#import "YourProjectName-Swift.h"
Note: remplacer YourProjectName
par le nom réel de votre projet. Ainsi, si votre projet s'appelle "CoolGameApp", l'en-tête Swift sera "CoolGameApp-Swift.h". Si votre nom de projet a des espaces, comme "Cool Game App", remplacez-les par des tirets: "Cool-Game-App-Swift.h"
3) Reconstruisez le projet.
Maintenant, vous devriez être en mesure d'accéder à l'extension en Objective-C:
[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification.blahblahblah object:self];
Il a fonctionné pour moi. J'essayais d'utiliser '@ objc', mais il ne peut être utilisé qu'avec des membres de classes et de protocoles, pas pour des extensions. Merci @leanne –
Et encore une chose, pour 'l'extension NSNotification', j'ai utilisé' let' au lieu de 'var', et cela a fonctionné. (évidemment, cela devrait fonctionner), il n'est donc pas nécessaire d'utiliser la propriété calculée s'il y a une chaîne de caractères constante. Et nous n'avons même pas besoin de 'public static', seule' extension' devrait être publique. –
À droite, Swift 3 ne nécessite pas la propriété calculée; Swift 4 fait, selon les docs. Et le rendre statique signifie qu'il est disponible sur la classe plutôt que d'exiger une instance. Codage heureux! (Assurez-vous de cliquer sur la coche pour indiquer que ma réponse a fonctionné pour vous.) – leanne