当前位置 : 主页 > 手机开发 > ios >

ios – 使用Swift导入aurioTouch库

来源:互联网 收集:自由互联 发布时间:2021-06-11
我正在尝试将Objective-C应用程序转换为 swift. 我想将aurioTouch中的类导入Swift应用程序,因此我创建了以下Bridging-Header文件: #import "AudioController.h" 但我在DCRejectionFilter.h,BufferManager.h,FFTHelpe
我正在尝试将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)的简单快速项目如下:
https://github.com/pika-shi/aurioTouch-Sample

本答案向您展示了如何解决桥接头#import,并且是如何创建Objective-C包装器对象的分步教程.

.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编译器标志:

enter image description here

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

> 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的成功构建.

Build Successful

网友评论