gpt4 book ai didi

ios - 在 Objective C 中使用 Swift 共享实例

转载 作者:搜寻专家 更新时间:2023-11-01 07:29:55 24 4
gpt4 key购买 nike

我在 Objective-C 中使用 Swift 类的共享实例。我无法创建共享实例并使用实例函数。这是我的 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 的共享实例?

最佳答案

您的 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

(我能找到的唯一可以引用的文档隐藏在 The Swift Programming LanguageAttributes 章节中——向下滚动到 objc 属性。)

关于ios - 在 Objective C 中使用 Swift 共享实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33250582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com