【问题标题】:Can't call custom swift init from objective-c class无法从objective-c类调用自定义swift init
【发布时间】:2021-03-12 23:02:00
【问题描述】:

我有一个自定义类,其中包含一个用 swift 编写的自定义初始化。我需要从 Objective-C 类中调用该 init。

斯威夫特

@objc public class MyClass: NSObject {

    public init(configuration config: Data)
    {
        super.init()
        // Do Stuff
    }
}

Objective-C

[[MyClass alloc] initWithConfiguration:CONFIG];

但是当我从 Objective-C 调用 init 时,编译器会抱怨

“MyClass”没有可见的@interface 声明选择器 'initWithConfiguration:'

我在这里错过了什么?

【问题讨论】:

  • 请证明您已将生成的标头导入到您的Objective-c .m文件中。
  • @matt 查看生成的头文件,它显示为 init 函数未在界面中列出。这可以解释为什么我的 obj-c 代码看不到它。

标签: objective-c swift


【解决方案1】:

您也必须将@objc 属性添加到初始化程序。像这样:

@objc public init(configuration config: Data)
{
    super.init()
    // Do Stuff
}

在这之后,不要忘记重新构建(CMD+B),否则 Xcode 会愚蠢地发出错误。

【讨论】:

  • 很遗憾不是这样。
  • @cHorse1981 是的。我试了一下,在生成的标头中看到了- (nonnull instancetype)initWithConfiguration:(NSData * _Nonnull)config OBJC_DESIGNATED_INITIALIZER;
  • @matt 我试过了,它没有出现在生成的标题中。还有其他事情发生(可能除此之外)。
  • @cHorse1981 好吧,我可以告诉你我在答案中做了什么,但这会重复这个答案,所以没有意义。如果 MyClass 标记为 @objc 并且 init(configuration:) 标记为 @objc看到在 -Swift.h 生成的标头中声明的该类和该初始化程序。如果 Objective-C 导入该标头,它看到这些声明。尝试清除派生数据并重新启动机器,然后再次构建并再次查看生成的接口文件。
  • @matt 您可以坚持认为这将满足您的所有需求,但显然还有其他事情要做。我听从了你的建议,但没有奏效。
猜你喜欢
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多