2017-10-18 72 views
3

我创建了一个扩展Notification.Name如下:如何使用Notification.Name扩展迅速,从3到Objective-C

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

}

现在我想在Objective-C使用这个扩展,但即使其公众也无法访问。

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

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

回答

2

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

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

  • 一个雨燕Notification.Name,因为你;和
  • 一个用于Objective-C对象(NSString,或者如果您愿意的话可能为NSNotification)。

1)一个Objective-C兼容的对象扩展添加到您的斯威夫特文件:

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

注:雨燕4,properties must be computed的Objective-C的兼容性。这将是这样的:

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

注意var在计算性能:计算性能不可能一成不变,所以不能用let

2)在Objective-C的文件,导入Xcode的生成斯威夫特头文件(以下任何其他进口):

#import "YourProjectName-Swift.h" 

注:与你的项目的实际名称替换YourProjectName。所以,如果你的项目被命名为“CoolGameApp”,Swift头将是“CoolGameApp-Swift.h”。如果您的项目名称中包含空格,例如“酷游戏应用程序”,请用短划线替换它们:“Cool-Game-App-Swift.h”

3)重建项目。现在

,你应该能够访问Objective-C的扩展:

[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification.blahblahblah object:self]; 
+0

它为我工作。 我试图使用'@ objc',但它只能用于类和协议的成员,而不能用于扩展。 谢谢@leanne –

+0

还有一件事,对于'扩展NSNotification',我使用'let'而不是'var',它工作。 (显然,它应该工作),所以没有必要使用计算属性,如果有一个常量字符串。 而我们甚至不需要'public static',只有'extension'应该公开。 –

+0

对,Swift 3不需要计算属性;根据文档,Swift 4的确如此。并使其成为静态的意味着它在课堂上可用而不需要实例。快乐的编码! (请务必点击复选标记以表明我的答案适合您。) – leanne

2

我的分机在迅速文件

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

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

@李亚男的回答是超级有用