使用Swift导入aurioTouch库

Hik*_*ura 3 objective-c core-audio ios swift

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

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

#import "AudioController.h"
Run Code Online (Sandbox Code Playgroud)

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

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

预期';' 在顶级声明者之后

以及AudioController.h:

未知类型名称'BufferManager'

未知类型名称'DCRejectionFilter'

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

更新

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

Swi*_*ect 8

本答案向您展示了如何解决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 <Foundation/Foundation.h>
@interface AudioControllerBridge : NSObject
    // ...
@end
Run Code Online (Sandbox Code Playgroud)

.mm

Objective-C++ 容忍所有的 C++只要它不在界面中暴露,就可以你所需要的.

#import "AudioControllerBridge.h"
#import "AudioController.h"
@implementation AudioControllerBridge
    // ...
@end
Run Code Online (Sandbox Code Playgroud)

当然,你可以简单地修改AudioController.h直接,但我们会考虑这是不好的做法:对于这个答案的其余部分,我们将假定你正试图整合aurioTouch 原样,恰好与零线 的代码改变.

实现AudioControllerBridge,您现在可以实例化AudioController,并导入C++正确编译所需的所有文件,这是您无法做到的.h.请记住,.h暴露给SwiftBriding-Header必须是纯粹的Objective-C界面.

// Bridging Header
#import "AudioControllerBridge.h"
Run Code Online (Sandbox Code Playgroud)

您很快就会发现需要下载CoreAudio/PublicUtility,因为某些文件就像CADebugPrintf示例中缺少的那样,并且不知何故不会在新项目中构建,至少在DEBUG模式下.

如果你到目前为止,你会发现你会得到十几个已弃用的警告,你现在可以忽略这些警告,并且有一半的ARC错误AudioController.mm.修复-fno-objc-arc 编译器标志:

在此输入图像描述

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

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

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

把它包起来

我花了1小时47分钟到达那一点(下面的证明).下一步当然是实际放入包装器代码AudioControllerBridge,以便它返回(包装):

BufferManager*          _bufferManager;
DCRejectionFilter*      _dcRejectionFilter;
- (BufferManager*) getBufferManagerInstance;
Run Code Online (Sandbox Code Playgroud)

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

它可以是清洁剂来包装BufferManagerDCRejectionFilter为好,使得它们可以自由地在使用夫特.我会把这个决定告诉读者.


演示

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

let ac = AudioControllerBridge()
Run Code Online (Sandbox Code Playgroud)

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

建立成功