2017-10-18 23 views
3

J'ai créé une extension pour Notification.Name comme ci-dessous:comment utiliser l'extension de Notification.Name de rapide 3 à Objective-C

public extension Notification.Name { 
     public static let blahblahblah = Notification.Name(rawValue: "blahblahblah") 

}

Maintenant, je veux utiliser cette extension en Objective-C, mais ce n'est pas accessible même si c'est public. Pouvez-vous me dire comment accéder et utiliser cette extension swift dans Objective-C et Swift à la fois? Précédemment j'utilisais des valeurs constantes dans Objective-C, mais maintenant pour mettre à jour mon code, je veux utiliser cette extension.

Répondre

2

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]; 
+0

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 –

+0

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. –

+0

À 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

2

Mon extension dans le fichier rapide

extension Notification.Name { 
    static let purchaseDidFinish = Notification.Name("purchaseDidFinish") 
} 

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") 
} 

@ réponse de Leanne était super utile