ios - 使用 Swift 导入 aurioTouch 库

标签 ios objective-c swift core-audio

我正在尝试将 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 .hObjective-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 编译器标志:

enter image description here

如果到目前为止你做到了( Prop ),并且添加了:

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

Build Phases 中对您的目标进行编译,您会发现它会构建并链接。

总结

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

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

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

BufferManagerDCRejectionFilter 包装起来可能会更干净,这样它们就可以在 Swift 中自由使用。我会让读者做出决定。


演示

仅作记录,以上所有说明均导致编译成功

let ac = AudioControllerBridge()

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

Build Successful

关于ios - 使用 Swift 导入 aurioTouch 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32481981/

相关文章:

ios - 带导航栏的自动布局 - 删除特定约束

ios - Restkit 和 CoreData 错误。无法调用 NSManagedObject 上的指定初始值设定项

android - 用于移动应用程序测试的 Selenium 插件或用于移动应用程序测试的任何其他更好和合适的工具

ios - 如何在 iOS 设备离线时加载本地 HTML 文件?

ios 核心数据 : make sure object is deleted from data source

ios - NSNotificationCenter 多次调用

swift - Xcode 无法识别新的测试函数

ios - 返回 UINavigationController 时未调用 viewWillAppear

ios - 集成 Realm 时出错

ios - 在 iOS 11 中从我的应用程序打开设置应用程序中的特定项目