使用SwiftPM在Swift中包装C代码
这篇文章将逐步指导构建可以与C代码交互的Swift库的过程。 它还将介绍如何将C接口包装到Swift API中。 所有使用SwiftPm 。 Swift Package Manager是一个功能强大的工具,这是一种从中获得最大收益的方法。
首先,要多少钱?
世界在C驱动的设备上运行。 无论我们是否意识到,我们每天都在使用这些设备。 C是软件的许多领域的过去,现在和据我们所知仍然是未来。 尤其是当性能成为重中之重时。
到处都有C库,C的最大好处就是它的性能。 太酷了,但是我们可以在Swift中使用这些库而不会带来麻烦吗? 我们可以混合使用C和Swift来达到更高的速度吗?
我们可以! 我们进行了所有分析,并在以后的文章中介绍了所有详细信息。 现在,您需要知道的是,从Swift调用C函数非常便宜,我的意思是说非常便宜。 另一个有趣的功能使Apple的热门新语言更具吸引力!
事不宜迟……开始吧!
使用SPM创建一个新项目
这非常简单,创建一个新目录,然后让SwiftPM发挥作用。
$ mkdir SwiftWrapper
$ cd SwiftWrapper
然后,
$ swift package init --type library
并且您应该具有这样的树结构:
迅捷包装
├──Package.swift
├──README.md
├──资料来源
│└──SwiftWrapper
│└──SwiftWrapper.swift
└──测试
├──LinuxMain.swift
└──SwiftWrapperTests
├──SwiftWrapperTests.swift
└──XCTestManifests.swift
将您的C代码放入项目中
我们将使用令人惊叹的RoaringBitmaps库中的C代码。 当然,请使用您自己的代码! 您只需要.c
和.h
文件。
在Sources/
下创建一个新文件夹,您将在其中存储C代码。 当前正在执行的命名约定如下所示: C[NameOfYourLibrary]
。 在我们的案例中,我们将其命名为CRoaring
。 然后创建一个include文件夹来存储您的.h
文件。 您应该得到这样的内容:
├──资料来源
│├──咆哮
││├──包括
│││└──roaring.h
││└──roaring.c
│└──SwiftWrapper
│└──SwiftWrapper.swift
配置Package.swift
这部分可能看起来很复杂,但实际上非常简单。 首先,请注意第一行: // swift-tools-version:4.0
是特殊注释。 它指定SwiftPM使用哪个工具版本。 忽略此特殊注释的软件包将默认为工具版本3.1.0。 工具版本还确定了用于编译软件包源代码的默认Swift语言版本。
products
代表客户端软件包所依赖的公开销售的软件包输出。 简单地说:包的输出 。 基本上,我们使用C文件创建一个库,然后可以在SwiftWrapper
依赖它。
targets
告诉SwiftPM在哪里可以找到源代码。 您还可以在其中为源代码添加依赖项。 默认情况下,SwiftPM将在Sources/
寻找一个名为: name: “ThisName”
的文件夹,并编译其中包含的代码。 如果您的文件夹有另一个名称,则可以通过添加以下标记来告诉SwiftPM: path: “./Sources/NameOfYourFolder”
。
然后,确保所有内容组合在一起:
$快速建立
包起来!
至此,我们已经完成了许多工作。 我们可以访问C代码。 虽然,您不想直接与C函数进行交互。 它们经常具有指针参数,snake_case命名并且不是面向对象的……这只是一团糟。 解决该问题的干净方法是将其包装在Swift API中。 在SwiftWrapper/
创建RoaringBitmap.swift
。 这是一个例子:
现在,要使用该API,请导入SwiftWrapper
并获得乐趣:
这是生产就绪的包装器: SwiftRoaring 。 如果您需要灵感,那是一个很好的起点。
现在怎么办?
是的,就是这么简单。 哦,这篇文章未涉及Git。 但是,您应该尽快将代码推送到GitHub。 这样,您可以将API导入其他项目。 另外,我们强烈建议您将Travis-CI添加到您的项目中,这很棒
谢谢阅读!
参考文献
- SwiftPM文档
- 迅捷咆哮
- 咆哮的位图
- CLang模块文档