将 Obj-C 桥接到 Swift 后缺少啥

Posted

技术标签:

【中文标题】将 Obj-C 桥接到 Swift 后缺少啥【英文标题】:What is missing after Bridging Obj-C to Swift将 Obj-C 桥接到 Swift 后缺少什么 【发布时间】:2016-01-05 13:54:53 【问题描述】:

我以前也做过,一般没有问题,设置桥接头等 这一次,我尝试将一个 Obj-C 框架 (github.com/jensmeder/FSKModem/) 导入到我的 swift 项目中。输入代码时,我可以“看到”所有 Obj-C 方法。 但是当我编译代码时,我会收到诸如“使用未声明的标识符‘删除’”或“使用未声明的标识符‘新’”之类的错误。 .m 文件中给出错误的代码示例:

    _audioFormat = new AudiostreamBasicDescription();

我熟悉 Swift,不了解 Obj-C,但我猜应该存在“删除”或“新”,对吧?它们是否属于我应该添加的一些框架? 我可以毫无问题地在 Obj-C 中编译原始代码,但我需要将它合并到我用 Swift 编写的项目中。 非常感谢您的帮助

更多信息... 以下函数位于 .m 文件中。你知道为什么“new”和“delete”关键字无法识别吗?当编译为普通的“Obj-C”项目时,这可以正常工作。该错误仅出现在 Swift 项目中(当然是在桥接标头之后):

-(void)dealloc

[self disconnect:NULL];

if (_audioFormat)

    delete _audioFormat;



-(void) setupAudioFormat

_audioFormat = new AudioStreamBasicDescription();
//...

除了 Foundation 之外,我是否应该添加一些我可能缺少的 #include?​​p>

【问题讨论】:

【参考方案1】:

newdelete 是 C++ 关键字;您可以在 C++ 文件(通常是 .cpp.cc)和 Objective-C++ 文件(总是 .mm)中使用它们。您不能在 Swift (.swift) 或 Objective-C (.m) 文件中使用它们。

从 Swift 的 Objective-C++ 文件中使用 Objective-C 类是完全有效的;您可以使用 Objective-C 包装 C++ 类以供 Swift 使用。但是,在普通的 Objective-C 中使用 C++ 是无效的。

很可能您只需将您的 Objective-C 文件重命名为 .mm

【讨论】:

嗨,在听从你的建议后,我得到了以下错误:Undefined symbols for architecture x86_64: (then a big list of them). 我设法编译了。刚从一个空白项目重新开始,并使用您的提示重命名为 .mm 非常感谢!【参考方案2】:

newdelete 是 C++ 中的关键字,而不是 Swift 或 Objective-C 中的关键字。

斯威夫特

let audioFormat = AudioStreamBasicDescription()

目标-C

AudioStreamBasicDescription* audioFormat = [[AudioStreamBasicDescription alloc] init];

【讨论】:

谢谢。这部分代码位于 .m 文件中。我不应该能够在不接触其内容的情况下使用该库吗?【参考方案3】:

在 Swift 中,您只需要在创建对象时调用对象初始化器即可。

_audioFormat = AudioStreamBasicDescription()

new 关键字是 allocinit 的 Objective-C 组合。

【讨论】:

以上是关于将 Obj-C 桥接到 Swift 后缺少啥的主要内容,如果未能解决你的问题,请参考以下文章

Obj-C 的 Swift 桥接头

对于桥接的 Objective-C 方法,这个 Swift 名称宏中缺少啥?

Swift 4.2 升级后将 Swift 类桥接到 React Native

使用 Swift 和 Obj-C 进行单元测试

Swift 无法将 NSNumber 桥接到 Int

Swift 无法将 NSNumber 桥接到 Float [重复]