在Objective C中使用Swift共享实例

时间:2015-10-21 03:46:05

标签: ios objective-c swift

我在Swift中有一个类的共享实例,我在Objective-C中使用它。我无法创建共享实例并使用实例功能。这是我的Swift代码。

class VideoPlayerSignaler: NSObject {
    static let sharedInstance = VideoPlayerSignaler()

    let playerAction = Signal<PlayerAction>()

    private override init() {

    }

    func firePlayerAction(action: PlayerAction) {
        playerAction.fire(action)
    }
}

这是我的Objective-C代码。

VideoPlayerSignaler *signaler = [VideoPlayerSignaler sharedInstance];

// This is the line that is producing the issue. 
// It's as if the signaler variable is a Class Instance
[signaler firePlayerAction: PlayerAction.Stop];

错误我生成了firePlayerAction不存在的状态。实质上,Objective C认为signaler变量是一个类实例。

我做错了什么以及如何修复它以使signaler成为VideoPlayerSignaler的共享实例?

1 个答案:

答案 0 :(得分:2)

您的Swift没有任何问题,或者您如何从ObjC访问单例实例 - 问题在于您传递给它的枚举值。

据推测,你的枚举声明看起来像这样:

enum PlayerAction: Int {
    case Stop, Collaborate, Listen // etc
}

要使您的枚举可供ObjC使用,您需要在声明前添加@objc

@objc enum PlayerAction: Int { /*...*/ }

这使它在ObjC中显示为Cocoa风格的NS_ENUM声明,通过将Swift枚举类型的名称与案例名称连接来为案例名称创建全局符号:

typedef NS_ENUM(NSInteger, PlayerAction) {
    PlayerActionStop = 1,
    PlayerActionCollaborate,
    PlayerActionListen, // etc
};

因此,当您调用从ObjC获取枚举值的方法时,您应该传递的是这些名称:

[signaler firePlayerAction: PlayerActionStop]; // NOT PlayerAction.Stop

(我能找到的唯一可以找到的文档隐藏在 Swift编程语言Attributes章节中 - 向下滚动到objc属性。)< / p>