使用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模块文档

Interesting Posts