我想将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)的简单快速项目如下:
https://github.com/pika-shi/aurioTouch-Sample
.mm并不代表斯威夫特
.mm也不是指Objective-C
它意味着Objective-C,只是将文件重命名为.mm没有任何改进.请注意,您仍然包含相同的.h文件,这些是问题开始的地方.这些.h引用C类,它们必须被包装.
将Objective包含在Objective-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,只要它不在接口中公开.
#import "AudioControllerBridge.h" #import "AudioController.h" @implementation AudioControllerBridge // ... @end
当然,您可以直接修改AudioController.h,但我们会考虑这种不好的做法:对于本答案的其余部分,我们假设您正在尝试按原样集成aurioTouch,正好更改了0行代码.
在AudioControllerBridge的实现中,您现在可以实例化AudioController,并导入正确编译所需的所有C文件,这是您在.h中无法做到的.请记住,你在Briding-Header中暴露给Swift的.h必须是一个纯粹的Objective-C接口.
// Bridging Header #import "AudioControllerBridge.h"
弧
您很快就会看到需要下载CoreAudio/PublicUtility,因为某些文件(例如CADebugPrintf)在示例中只是缺少,并且不知何故不会在您的新项目中构建,至少在DEBUG模式下.
如果你到目前为止,你会发现你会得到十几个已弃用的警告,你现在可以忽略它们,而AudioController.mm中的ARC错误只有一半. Fix with -fno-objc-arc编译器标志:
如果你到目前为止(道具),并添加:
> Accelerate.framework
> AudioToolbox.framework
> AVFoundation.framework
在Build Phases中你的目标并编译,你会发现它构建和链接.
把它包起来
我花了1小时47分钟到达那一点(下面的证明).下一步当然是实际将包装器代码放在AudioControllerBridge中,以便它返回(换行):
BufferManager* _bufferManager; DCRejectionFilter* _dcRejectionFilter; - (BufferManager*) getBufferManagerInstance;
这是该类中的3个非Objective-C元素.
包装BufferManager和DCRejectionFilter也可能更清晰,因此可以在Swift中自由使用它们.我会把这个决定告诉读者.
演示
只是为了记录,上面的所有说明导致成功编译
let ac = AudioControllerBridge()
如截图所示.它显示了所需的所有文件,并在iOS 9上展示了针对iPhone 6的Xcode 7的成功构建.