【问题标题】:Using Swift Shared Instance in Objective C在 Objective C 中使用 Swift 共享实例
【发布时间】:2015-10-21 03:46:04
【问题描述】:

我在 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 的共享实例?

【问题讨论】:

  • 如果您发布信号类的代码以及 Objective-C 中的 firstPlayerAction,我可能会提供帮助。
  • 它会产生什么问题?
  • 我可以给你图书馆的代码。 https://github.com/artman/Signals
  • 其实这里的signaler真的是一个“类实例”
  • 我就是这么想的。 XCode 无法识别函数或实例变量。

标签: ios objective-c swift


【解决方案1】:

你的 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 属性。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 2016-05-07
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多