以下のようにNotification.Name
の拡張機能を作成しました。
public extension Notification.Name {
public static let blahblahblah = Notification.Name(rawValue: "blahblahblah")
}
今、私はこの拡張機能をObjective-Cで使用したいのですが、公開されていてもアクセスできません。
このSwift Objective-Cの拡張機能とSwift両方の拡張機能にアクセスして使用する方法を教えてください。
以前はObjective-Cで定数値を使用していましたが、コードをアップグレードするために、この拡張機能を使用します。
Notification.Name
はObjective-Cには存在しません。そして、Objective-Cの型NotificationName
は、実際には単なるNSString
です。 Objective-CでSwiftのものを使用するには、クラスが両方で使用可能である必要があり、Swift構造体(Notification
またはString
など)にすることはできません。 )。
やりたいことを行うには、2つの拡張機能が必要です。
Notification.Name
、ご存知のとおり。そして、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];
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の答えはとても役に立ちました
ここでの回答に加えて、Obj-Cコードがそれを見る前に、NSNotification拡張機能に@objcを追加する必要がありました(Swift 4)。