J'ai créé une extension pour Notification.Name
comme ci-dessous:
public extension Notification.Name {
public static let blahblahblah = Notification.Name(rawValue: "blahblahblah")
}
Maintenant, je veux utiliser cette extension dans Objective-C, mais elle n'est pas accessible même si son public.
Pouvez-vous me dire comment accéder et utiliser cette extension Swift dans Objective-C et Swift les deux?)
auparavant, j'utilisais des valeurs constantes dans Objective-C, mais maintenant pour mettre à niveau mon code, je veux utiliser cette extension.
Notification.Name
n'existe pas dans Objective-C. Et le type Objective-C NotificationName
n'est vraiment qu'un NSString
. Pour utiliser Swift stuff dans Objective-C, la classe doit être disponible dans les deux, et ne peut pas être une structure Swift (comme Notification
ou String
, disons).
Pour faire ce que vous voulez, vous devez alors avoir deux extensions:
Notification.Name
, comme vous l'avez fait; et,NSString
, disons, ou peut-être NSNotification
si vous préférez).1) Ajoutez une extension d'objet compatible Objective-C à votre fichier Swift:
public extension NSNotification {
public static let blahblahblah: NSString = "blahblahblah"
}
Remarque: dans Swift 4, les propriétés doivent être calculées pour la compatibilité Objective-C. Cela ressemblerait à:
@objc 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 immuables, donc vous ne pouvez pas utiliser let
.
2) Dans le fichier Objective-C, importez le fichier d'en-tête Swift Swift $ === généré sous les autres importations):
#import "YourProjectName-Swift.h"
Remarque: remplacez YourProjectName
par le nom réel de votre projet. Donc, si votre projet est nommé "CoolGameApp", l'en-tête Swift serait "CoolGameApp-Swift.h". Si le nom de votre projet comporte des espaces, comme "Cool Game App", remplacez-les par tirets: "Cool-Game-App-Swift.h"
3) Reconstruisez le projet.
Maintenant, vous devriez pouvoir accéder à l'extension dans Objective-C:
[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification.blahblahblah object:self];
Mon extension dans le fichier Swift
extension Notification.Name {
static let purchaseDidFinish = Notification.Name("purchaseDidFinish")
}
@objc extension NSNotification {
public static let purchaseDidFinish = Notification.Name.purchaseDidFinish
}
// OBJECTIVE-C
#import YourProjectName-Swift.h
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(purchaseDidFinish) name:NSNotification.purchaseDidFinish object:nil];
// Swift
NotificationCenter.default.addObserver(self, selector: #selector(purchaseDidFinish), name: .purchaseDidFinish, object: nil)
@objc func purchaseDidFinish(notification: Notification) {
print("purchaseDidFinish")
}
La réponse de @ leanne était super utile
En plus des réponses ici, j'ai dû ajouter @objc à mon extension NSNotification avant que mon code Obj-C ne puisse le voir (Swift 4).