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
本答案向您展示了如何解决Bridging Header #import,并且是如何创建Objective-C包装器对象的分步教程.
.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暴露给Swift的Briding-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.frameworkAudioToolbox.frameworkAVFoundation.framework在Build Phases中你的目标并编译,你会发现它构建和链接.
把它包起来
我花了1小时47分钟到达那一点(下面的证明).下一步当然是实际放入包装器代码AudioControllerBridge,以便它返回(包装):
BufferManager* _bufferManager;
DCRejectionFilter* _dcRejectionFilter;
- (BufferManager*) getBufferManagerInstance;
Run Code Online (Sandbox Code Playgroud)
这是其中的3个非Objective-C元素class.
它可以是清洁剂来包装BufferManager和DCRejectionFilter为好,使得它们可以自由地在使用夫特.我会把这个决定告诉读者.
只是为了记录,上面的所有说明导致成功编译
let ac = AudioControllerBridge()
Run Code Online (Sandbox Code Playgroud)
如截图所示.它显示了所需的所有文件,并在iOS 9上展示了针对iPhone 6的Xcode 7的成功构建.
| 归档时间: |
|
| 查看次数: |
1241 次 |
| 最近记录: |