web-dev-qa-db-ja.com

Swift 3からObjective-CへのNotification.Name拡張の使用方法

以下のようにNotification.Nameの拡張機能を作成しました。

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

}

今、私はこの拡張機能をObjective-Cで使用したいのですが、公開されていてもアクセスできません。

このSwift Objective-Cの拡張機能とSwift両方の拡張機能にアクセスして使用する方法を教えてください。

以前はObjective-Cで定数値を使用していましたが、コードをアップグレードするために、この拡張機能を使用します。

14
BARS

Notification.NameはObjective-Cには存在しません。そして、Objective-Cの型NotificationNameは、実際には単なるNSStringです。 Objective-CでSwiftのものを使用するには、クラスが両方で使用可能である必要があり、Swift構造体(NotificationまたはStringなど)にすることはできません。 )。

やりたいことを行うには、2つの拡張機能が必要です。

  • Swift Notification.Name、ご存知のとおり。そして、
  • 1つはObjective-Cオブジェクト用です(たとえば、NSString、または場合によってはNSNotification)。

1)Objective-C互換のオブジェクト拡張子をSwiftファイルに追加します:

public extension NSNotification {
    public static let blahblahblah: NSString = "blahblahblah"
}

注:Swift 4、 プロパティを計算する必要があります の場合、Objective-Cとの互換性のため、次のようになります。

@objc public extension NSNotification {
    public static var blahblahblah: NSString {
        return "blahblahblah"
    }
}

計算されたプロパティのvarに注意してください。計算されたプロパティは不変ではないため、letを使用できません。

2)Objective-Cファイルで、Xcodeで生成されたSwiftヘッダーファイル(他のインポートより下)をインポートします):

#import "YourProjectName-Swift.h"

注:YourProjectNameを実際のプロジェクト名に置き換えます。したがって、プロジェクトの名前が「CoolGameApp」の場合、Swiftヘッダーは「CoolGameApp-Swift.h」になります。プロジェクト名に「Cool Game App」のようにスペースが含まれている場合は、ダッシュ:「Cool-Game-App-Swift.h」

3)プロジェクトをリビルドします。

これで、Objective-Cの拡張機能にアクセスできるようになります。

[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification.blahblahblah object:self];
12
leanne

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

@leanneの答えはとても役に立ちました

21

ここでの回答に加えて、Obj-Cコードがそれを見る前に、NSNotification拡張機能に@objcを追加する必要がありました(Swift 4)。

5
janineanne