Ios 在Objective C中使用Swift共享实例
我在Swift中有一个在Objective-C中使用的类的共享实例。我无法创建共享实例并使用实例函数。这是我的Swift密码Ios 在Objective C中使用Swift共享实例,ios,objective-c,swift,Ios,Objective C,Swift,我在Swift中有一个在Objective-C中使用的类的共享实例。我无法创建共享实例并使用实例函数。这是我的Swift密码 class VideoPlayerSignaler: NSObject { static let sharedInstance = VideoPlayerSignaler() let playerAction = Signal<PlayerAction>() private override init() { }
class VideoPlayerSignaler: NSObject {
static let sharedInstance = VideoPlayerSignaler()
let playerAction = Signal<PlayerAction>()
private override init() {
}
func firePlayerAction(action: PlayerAction) {
playerAction.fire(action)
}
}
我产生的错误表明FireLayerAction不存在。本质上,Objective C认为信号器
变量是类实例
我做错了什么?如何修复它,使
signaler
成为VideoPlayerSignaler
的共享实例?您的Swift没有问题,或者您如何从ObjC访问singleton实例没有问题-问题是您传递给它的枚举值
您的enum声明可能如下所示:
enum PlayerAction: Int {
case Stop, Collaborate, Listen // etc
}
要使您的枚举可供ObjC访问,您需要在声明前面加上@ObjC
:
@objc enum PlayerAction: Int { /*...*/ }
这使其在ObjC中显示为Cocoa样式的NS_ENUM
声明,通过将Swift ENUM类型的名称与案例名称连接起来,为案例名称创建全局符号:
typedef NS_ENUM(NSInteger, PlayerAction) {
PlayerActionStop = 1,
PlayerActionCollaborate,
PlayerActionListen, // etc
};
因此,当您调用从ObjC获取枚举值的方法时,应该传递这些名称:
[signaler firePlayerAction: PlayerActionStop]; // NOT PlayerAction.Stop
(我能找到的关于这一点的唯一文档都在Swift编程语言的章节中-向下滚动到
objc
属性。)如果您发布信号类的代码以及Objective-C中的第一个PlayerAction,我可能可以帮上忙。它会产生什么问题?我可以给您库代码<代码>https://github.com/artman/Signals事实上,这里的信号器实际上是一个“类实例”,我就是这么想的。XCode无法识别函数或实例变量。
[signaler firePlayerAction: PlayerActionStop]; // NOT PlayerAction.Stop