Notification.Name
在Objective-C中不存在。而Objective-C类型NotificationName
实际上只是一个NSString
。要在Objective-C中使用Swift,这个类必须在两者中都可用,并且不能是Swift结构(比如说Notification
或String
)。
做你想要什么,那么,你需要有两个扩展:
- 一个雨燕
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];
它为我工作。 我试图使用'@ objc',但它只能用于类和协议的成员,而不能用于扩展。 谢谢@leanne –
还有一件事,对于'扩展NSNotification',我使用'let'而不是'var',它工作。 (显然,它应该工作),所以没有必要使用计算属性,如果有一个常量字符串。 而我们甚至不需要'public static',只有'extension'应该公开。 –
对,Swift 3不需要计算属性;根据文档,Swift 4的确如此。并使其成为静态的意味着它在课堂上可用而不需要实例。快乐的编码! (请务必点击复选标记以表明我的答案适合您。) – leanne