使用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
,其中.h
在Objective-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
元素。
包装BufferManager
和DCRejectionFilter
也可能更清晰,因此它们可以在Swift中自由使用。 我会把这个决定告诉读者。
演示
只是为了记录,上面的所有说明导致成功的编译
let ac = AudioControllerBridge()
如截图所示。 它显示了所需的所有文件,并在iOS 9上展示了针对iPhone 6的Xcode 7的成功构建。