如何使用从swift 3到Objective-C的Notification.Name扩展

BAR*_*ARS 12 notifications extension-methods nsnotification ios swift3

我创建了一个扩展名,Notification.Name如下所示:

public extension Notification.Name {
      public static let blahblahblah = Notification.Name(rawValue: "blahblahblah")
Run Code Online (Sandbox Code Playgroud)

}

现在我想在Objective-C中使用这个扩展,但即使它是公共的也无法访问.

你能告诉我如何在Objective-C和Swift中访问和使用这个swift扩展吗?

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

War*_*shi 23

我在swift文件中的扩展名

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

@objc extension NSNotification {
    public static let purchaseDidFinish = Notification.Name.purchaseDidFinish
}
Run Code Online (Sandbox Code Playgroud)
// OBJECTIVE-C

#import YourProjectName-Swift.h

[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(purchaseDidFinish) name:NSNotification.purchaseDidFinish object:nil];
Run Code Online (Sandbox Code Playgroud)
// SWIFT
NotificationCenter.default.addObserver(self, selector: #selector(purchaseDidFinish), name: .purchaseDidFinish, object: nil)
Run Code Online (Sandbox Code Playgroud)
@objc func purchaseDidFinish(notification: Notification) {
    print("purchaseDidFinish")
}
Run Code Online (Sandbox Code Playgroud)

@ leanne的回答非常有帮助

  • 优秀的解决方 非常感谢^^但是,不得不在第二个扩展名(NSNotification)上添加"@objc",以便能够在objc代码中使用它,当然由于swift 4 objc新的推理规则;)(如@中所提到的) janineanne回答) (2认同)

lea*_*nne 13

Notification.NameObjective-C中不存在.而Objective-C类型NotificationName实际上只是一个NSString.要在Objective-C中使用Swift,该类必须在两者中都可用,并且不能是Swift结构(比如说Notification或者String说).

要做你想做的事,那么你需要有两个扩展:

  • 一个为斯威夫特Notification.Name,就像你一样; 和,
  • 一个用于Objective-C对象(NSString例如,或者NSNotification如果您愿意,也许如果您喜欢).

1)向Swift文件添加与Objective-C兼容的对象扩展:

public extension NSNotification {
    public static let blahblahblah: NSString = "blahblahblah"
}
Run Code Online (Sandbox Code Playgroud)

注意:在Swift 4中,必须为Objective-C兼容性计算属性.那看起来像是:

@objc public extension NSNotification {
    public static var blahblahblah: NSString {
        return "blahblahblah"
    }
}
Run Code Online (Sandbox Code Playgroud)

注意var计算属性:计算属性不能是不可变的,所以不能使用let.

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

#import "YourProjectName-Swift.h"
Run Code Online (Sandbox Code Playgroud)

注意:替换YourProjectName为项目的实际名称.因此,如果您的项目名为"CoolGameApp",则Swift标题将为"CoolGameApp-Swift.h".如果您的项目名称有空格,例如"酷游戏应用程序",请用破折号替换它们:"Cool-Game-App-Swift.h"

3)重建项目.

现在,您应该能够访问Objective-C中的扩展:

[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification.blahblahblah object:self];
Run Code Online (Sandbox Code Playgroud)


jan*_*nne 5

除了这里的答案之外,在我的Obj-C代码可以看到它之前,我必须将@objc添加到我的NSNotification扩展中(Swift 4).