我正在尝试将 Objective-C 应用程序转换为 swift。
我想在 aurioTouch 中导入类到 Swift 应用程序,所以我创建了以下 Bridging-Header 文件:
#import "AudioController.h"
但我在 DCRejectionFilter.h、BufferManager.h、FFTHelper.h 中收到以下错误:
Unknown type name 'class'; did you mean 'Class'?
Expected ';' after top level declarator
也在 AudioController.h 中:
Unknown type name 'BufferManager'
Unknown type name 'DCRejectionFilter'
当然,我使用 .mm 而不是 .m,但这不起作用。
更新
仅包含 aurioTouch 库(带有 Obj-C 和 C++)的简单 swift 项目如下: https://github.com/pika-shi/aurioTouch-Sample
最佳答案
当前的答案向您展示了如何解决 Bridging Header
#import
,并且是关于如何创建 的分步教程>Objective-C
包装器对象。
.mm 不代表 Swift
.mm 也不代表 Objective-C
这意味着 Objective-C++
,仅将文件重命名为 .mm
没有任何改进。请注意,您仍然包含相同的 .h
文件,而那些 正是问题开始的地方。这些 .h
引用 C++
类,它们必须被包装。
在 Objective-C 中包装 C++
AudioController.h
文件不是 Objective-C
文件:它包含 BufferManager.h
,它是 C++
文件,编译就在那里停止。
你需要创建一个真正的包装器,比如 AudioControllerBridge
.h
在 Objective-C
和 .mm
可以依次引用 C++
:
.h
绝对绝对不允许C++
,显式,包含,否则。
#import <Foundation/Foundation.h>
@interface AudioControllerBridge : NSObject
// ...
@end
.mm
Objective-C++
可以容忍您需要的所有 C++
,只要它不暴露在接口(interface)中即可。
#import "AudioControllerBridge.h"
#import "AudioController.h"
@implementation AudioControllerBridge
// ...
@end
当然,您可以直接修改 AudioController.h
,但我们会考虑这种不良做法:对于本答案的其余部分,我们将假设您正在尝试集成 aurioTouch 按原样,恰好更改了 0 行代码。
在AudioControllerBridge
的实现中,您现在可以实例化AudioController
,并导入所有C++
文件您需要进行适当的编译,而这在 .h
中是做不到的。请记住,您在 Briding-Header
中向 Swift 公开的 .h
必须是纯 Objective-C
接口(interface).
// Bridging Header
#import "AudioControllerBridge.h"
圆弧
您很快就会发现需要下载 CoreAudio/PublicUtility因为一些文件,如 CADebugPrintf
只是在示例中丢失,并且不会以某种方式在您的新项目中构建,至少在 DEBUG
模式下。
如果到目前为止你做到了,你会发现你会收到一打弃用警告,你现在可以忽略,和一半的 ARC AudioController.mm
中的错误。 Fix使用 -fno-objc-arc
编译器标志:
如果到目前为止你做到了( Prop ),并且添加了:
Accelerate.framework
AudioToolbox.framework
AVFoundation.framework
在 Build Phases 中对您的目标进行编译,您会发现它会构建并链接。
总结
我花了 1 小时 47 分钟才达到那个点(下面的证明)。下一步当然是将包装器代码实际放入 AudioControllerBridge
中,以便它返回(包装):
BufferManager* _bufferManager;
DCRejectionFilter* _dcRejectionFilter;
- (BufferManager*) getBufferManagerInstance;
这是 class
中的 3 个非 Objective-C
元素。
将 BufferManager
和 DCRejectionFilter
包装起来可能会更干净,这样它们就可以在 Swift 中自由使用。我会让读者做出决定。
演示
仅作记录,以上所有说明均导致编译成功
let ac = AudioControllerBridge()
如屏幕截图所示。它显示了所有所需的文件,并显示了在 Xcode 7 上为 iOS 9 上的 iPhone 6 成功构建。
关于ios - 使用 Swift 导入 aurioTouch 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32481981/