我为Notification.Name创建了一个扩展,如下所示:
public extension Notification.Name { public static let blahblahblah = Notification.Name(rawValue: "blahblahblah")
}
现在我想在Objective-C中使用这个扩展,但即使它是公共的也无法访问.
你能告诉我如何在Objective-C和Swift中访问和使用这个swift扩展吗?
解决方法
Objective-C中不存在Notification.Name.而Objective-C类型NotificationName实际上只是一个NSString.要在Objective-C中使用Swift,该类必须在两者中都可用,并且不能是Swift结构(比如Notification或String).
要做你想做的事,那么你需要有两个扩展:
>一个用于Swift Notification.Name,就像你一样;和,
>一个用于Objective-C对象(例如,NSString,或者如果您愿意,可能是NSNotification).
1)向Swift文件添加与Objective-C兼容的对象扩展:
public extension NSNotification { public static let blahblahblah: NSString = "blahblahblah" }
注意:在Swift 4中,properties must be computed用于Objective-C兼容性.那看起来像是:
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-Swift.h”
3)重建项目.
现在,您应该能够访问Objective-C中的扩展:
[[NSNotificationCenter defaultCenter] postNotificationName:NSNotification.blahblahblah object:self];