如何使用 Notification.Name 从 Swift 扩展到 Objective-C?

How to use Notification.Name extension from Swift to Objective-C?

我为 Notification.Name 创建了如下扩展:

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

现在我想在 Objective-C 中使用此扩展程序,但即使 public.

也无法访问它

如何在 Objective-C 和 Swift 中访问和使用此 Swift 扩展程序?

以前我在 Objective-C 中使用常量值,但现在我正在升级我的代码并想使用这个扩展。

Notification.Name 在 Objective-C 中不存在。 Objective-C 类型 NotificationName 实际上只是一个 NSString。要在 Objective-C 中使用 Swift 内容,class 必须在两者中都可用,并且不能是 Swift 结构(如 NotificationString, 说).

要为所欲为,那么,你需要有两个扩展:

  • 一个用于 Swift Notification.Name,如您所愿;并且,
  • 一个 Objective-C object(NSString,或者 NSNotification,如果你愿意)。

1) 添加一个 Objective-C 兼容的 object 扩展到你的 Swift 文件:

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

注意:在 Swift 4 中,properties must be computed 用于 Objective-C 兼容性。看起来像:

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

注意计算 属性 中的 var:计算属性不能不可变,因此不能使用 let

2) 在 Objective-C 文件中,导入 Xcode 生成的 Swift header 文件(在任何其他导入下方):

#import "YourProjectName-Swift.h"

注意:将YourProjectName替换为您项目的实际名称。因此,如果您的项目名为 "CoolGameApp",则 Swift header 将是 "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 代码可以看到它之前将 @objc 添加到我的 NSNotification 扩展中 (Swift 4)。