使用Swift导入aurioTouch库

我正在尝试将Objective-C应用程序转换为swift。

我想将aurioTouch中的类导入到Swift应用程序中,因此我创建了以下Bridging-Header文件:

#import "AudioController.h" 

但我在DCRejectionFilter.h,BufferManager.h,FFTHelper.h中收到以下错误:

未知的类型名称’class’; 你的意思是’上课’吗?

期待’;’ 在顶级声明者之后

以及AudioController.h:

未知类型名称’BufferManager’

未知类型名称’DCRejectionFilter’

当然我使用.mm而不是.m,但这不起作用。

更新

包含aurioTouch库(带Obj-C和C ++)的简单快速项目如下: https : //github.com/pika-shi/aurioTouch-Sample

本答案向您展示了如何解决Bridging Header #import ,以及如何创建Objective-C包装器对象的分步教程。

.mm并不代表斯威夫特

.mm也不代表Objective-C

它意味着Objective-C++ ,只是将文件重命名为.mm没有任何改进。 请注意,您仍然包含相同的.h文件, 这些是问题开始的地方。 这些.h引用C++类,它们必须被包装。

在Objective-C中包装C ++

AudioController.h文件不是Objective-C文件:它包含BufferManager.h ,它是一个C++文件,编译就在那里停止。

你需要创建一个真正的包装器,比如AudioControllerBridge ,其中.hObjective-C ,而.mm可以反过来引用C++

。H

当然,没有C++允许,明确,包含或其他。

 #import  @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错误只有一半。 修复 -fno-objc-arc 编译器标志

在此处输入图像描述

如果你到目前为止(道具),并添加:

  • Accelerate.framework
  • AudioToolbox.framework
  • AVFoundation.framework

Build Phases中编译你的目标,你会发现它构建和链接。

把它包起来

我花了1小时47分钟到达那一点(下面的certificate) 。 下一步当然是实际将包装器代码放在AudioControllerBridge ,以便它返回(换行):

 BufferManager* _bufferManager; DCRejectionFilter* _dcRejectionFilter; - (BufferManager*) getBufferManagerInstance; 

这是class中的3个非Objective-C元素。

包装BufferManagerDCRejectionFilter也可能更清晰,因此它们可以在Swift中自由使用。 我会把这个决定告诉读者。


演示

只是为了记录,上面的所有说明导致成功的编译

 let ac = AudioControllerBridge() 

如截图所示。 它显示了所需的所有文件,并在iOS 9上展示了针对iPhone 6的Xcode 7的成功构建。

建立成功