其他分享
首页 > 其他分享> > c – 如何在Swift项目中使用Superpowered lib

c – 如何在Swift项目中使用Superpowered lib

作者:互联网

我想在Swift中制作一个应用程序,只需通过iPhone的麦克风录制,然后播放录制的声音.

为此,我想使用lib Superpowered这是一个带头文件的静态库.

为此,我尝试在项目中拖放.a和头文件(Xcode为我创建一个桥接头文件),在Xcode>中的“链接框架和库”中添加.a.目标>一般(在Xcode>目标>构建阶段>“链接二进制与库”)并索引Xcode中的.h文件路径>目标>构建设置>搜索路径>图书馆搜索路径.

但有了这个我有错误“ld:符号(s)找不到架构arm64”
XCode: Undefined symbols for architecture arm64 error完全相同,我尝试了我在网上找到的所有解决方案,仍无法编译.

所以!

Superpowered为我们提供了一个示例应用程序,以展示如何混合Objective-C并在Swift项目中使用它们的lib(如果你想要https://github.com/superpoweredSDK/Low-Latency-Android-Audio-iOS-Audio-Engine,这里是git的链接).

以下是示例项目的一些屏幕截图,其中包含我理解的内容以及我不了解的内容:

Bridging header file Superpowered

Bridging-Header-File包含了我想在我的Swift代码中使用的lib方法的原型(我不喜欢这个,但如果它是唯一的方法……).

ViewController file

viewController文件,其中Swift中的代码是,我可以创建一个Superpowered对象,感谢Bridging-Header-File,并调用我放入它的方法.

.mm file

和wtf我甚至不明白为什么这个Objective-C文件在这里以及它包含什么.它无处不在,甚至不是他们的lib文件.

因此,考虑到这个示例项目,我创建了自己的项目,这里有一些截图:

Briging-Header-File

同样的Bridging-Header-File在示例项目中除了我包含SuperpoweredIOSAudioIO.h之外,所以我可以使用SuperpoweredIOSAudioIODelegate.

viewController

我的viewController文件,其中Swift中的代码是,我可以创建一个Superpowered对象感谢Bridging-Header-File,并调用我放入它的方法.

直到这里,它是伟大的,除了我不能例证创建一个SuperpoweredRecorder对象.如果我尝试在我的Bridging-Header-File中包含SuperpoweredRecorder.h文件,我会遇到以下错误:

errors

所以我看到它是因为SuperpoweredRecorder.h包含一些.cpp文件而且我必须为cpp创建一个包装器(有点像我使用桥接头,没有?)但是包括.h和.mm文件而且我不知道我要把那个.mm文件放进去(SuperpoweredRecorder.cpp的代码?但是我无法访问它)

所以,是的,我对所有这些东西有点困惑,你能帮我理解如何在Swift项目中使用所有Superpowered lib吗?

解决方法:

正如我在评论@OmniProg时所说,我与Superpowered的首席技术官进行了一些对话,帮助我找到了下面的解决方案.

因此,由于Swift不能直接与C交互,但可以使用Objective-C,我不得不在Objective-C(.mm文件,C和Objective-C之间的混合)中创建对象,这些对象包含了lib Superpowered的C类.

以下是来自lib的SuperpoweredRecorder对象的示例:

SuperpoweredRecorderWrapped.h

在这里,我创建了一个.h文件,其中我使用名称SuperpoweredRecorderWrapped对我的包装器进行原型设计,并且我还在原型中使用了我想要使用的lib的SuperpoweredRecorder的所有方法.

SuperpoweredRecorderWrapped.mm

然后我创建一个新的.m文件,我重命名.mm并在其上实现SuperpoweredRecorderWrapped.
我导入SuperpoweredRecorderWrapped.h和SuperpoweredRecorder.h.
我创建一个SuperpoweredRecorder对象作为名为_wrapped的属性,在我的方法中,我调用_wrapped对象的相应方法.
有了这个,当我在Swift代码中调用SuperpoweredRecorderWrapped的开始时,这个将调用_wrapped的一个SuperpoweredRecorder对象的start.看到诀窍?

Bridge-Header

最后,我将所有包装的类包含在我的Bridging-Header中,就像我可以从Swift实例化我的包装对象一样.

注意:所有C代码都必须在.mm文件中,这就是为什么我在.mm文件中创建包含C代码的.h的#include而不是我的.h文件.

标签:objective-c-2,c,ios,swift
来源: https://codeday.me/bug/20191005/1857045.html