web-dev-qa-db-fra.com

comment utiliser l'extension Notification.Name de Swift 3 à Objective-C

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.

14
BARS

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:

  • un pour le Swift Notification.Name, comme vous l'avez fait; et,
  • un pour un objet Objective-C (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];
12
leanne

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

21
Warif Akhand Rishi

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

5
janineanne