在Swift应用中使用C,C ++和Objective-C框架
在Swift应用中使用C,C ++和Objective-C框架
我在尝试中做了一个演讲!Swift东京今年关于在Swift应用程序中使用C,C ++和Objective-C框架。 演示文稿非常简洁,因此我决定详细记录内容以提供更多信息。
本文的结构将分为:
- C,C ++,Objective-C和Swift之间的语言连接
- 如何建立依存关系
- 为什么选择包装器以及如何编写包装器
C,C ++,Objective-C和Swift之间的语言连接
C到Swift
C已经47岁了,Swift是一种新的强大的开源语言,它支持C。尽管它不能编译C代码,但它与C具有直接的互操作性,因此我们可以在Swift中直接使用已编译的C代码。
从C ++到Swift
C ++和Swift无法直接交谈,因此需要一些手动的中间阶段,例如C或Objective-C。
C ++是C的超集,它提供了面向对象编程的支持。 由于Swift支持C,一种方法是使用仅C的API公开C ++库,然后Swift应用程序可以直接使用该库。
Objective-C ++可以编译包含C ++和Objective-C组合的源文件。 另一种方法是将C ++库包含在Objective-C框架中,并将其提供给Swift。
从Objective-C到Swift
Swift可以与可可和大量现有的Objective-C代码一起使用,因此Objective-C与Swift之间的通信非常简单。
如何建立依存关系
为了能够在项目中使用框架,我们首先需要设置依赖项。 我将一一示范。
C库到Swift应用
AC库通常被编译为静态库,这里的挑战是库不包含接口。 Swift也不会自动读取头文件。 因此,这里有一个问题:C标头不可见。 解决此问题的技巧是使用模块映射。 有关在Swift应用程序中设置C库依赖关系的逐步指南,请阅读我的其他中篇文章。
C ++库到Swift应用
正如我之前提到的,Swift无法直接与C ++对话,因此让我们添加一些手动中间阶段,例如,创建一个包含C ++库的Objective-C框架。 在Objective-C框架内部,我们需要将所有C功能包装到Objective-C中。 为了能够在一个文件中同时编译C和Objective-C,诀窍是使用Objective-C ++。 我们可以通过将.m文件重命名为.mm来实现 。 有关详细的设置,请参阅这篇中等文章。
Swift应用的Objective-C框架
为了能够在快速的应用程序中使用Objective-C框架,设置非常简单。 我们需要将Objective-C框架或项目包含到快速应用程序中。 如果我们不使用任何依赖关系管理工具,则只需将Objective-C xcodeproj或框架拖到swift项目中即可。 然后链接框架并导入Objective-C模块,现在我们完成了。
为什么选择包装器以及如何编写包装器
我们已经成功建立了C,C ++和Objective-C的依赖关系,这是否意味着我们可以开始在快速的应用程序中直接使用它们了? 好吧,是和不是。
目标C可以很好地转换为Swift,因此我们无需在其中做太多事情。 另一方面,C ++完全不像我们前面看到的那样翻译。 在这两者之间,我们可以使用C,而无需使用其他代码,但是在Swift端生成的接口并不总是对开发人员超级友好,有时需要几行,我们不想重复很多。
为了使界面Swift友好并抽象一些底层细节,这正是包装器的目的。
C包装
C是这4种语言中最早的一种。 C手动管理内存,它也具有Swift没有的指针。 为了在Swift中使用C功能,有时需要我们写几行,我们不想重复很多。 因此,值得编写一个干净且Swift友好的界面。
我创建了一个示例C框架,并尝试一张一张地映射问题和解决方案。 有关详细信息,请查看此github项目。
C ++包装器
如果我们要为C ++库编写一个Objective-C包装器,我们需要了解Objective-C和C ++是如何对话的。 例如,如何将C ++字符串转换为Objective-C NSString,如何在Objective-C中实例化C ++类实例。 有关如何解决这些问题的更多详细信息,请检查此github项目。
Objective-C包装器
由于Swift旨在支持大量现有的Objective-C代码,因此无需为其创建包装器。 如果我们要处理的是非常老的Objective-C框架,我们可能想使用NS_SWIFT_NAME来转换某些类和函数名称,使其更加快捷。
你怎么看? 如果您有任何疑问,建议或想与我讨论更多,请通过Twitter @humlelu与我联系。
谢谢阅读! 🌸
- 我们可以从手机(Android / iOS)中select一个图像,并使用通用代码(Xamarin Forms)将其上传到服务器?
- ios – 简单的例子来获取相册列表?
- UITableViewController将不会调用cellForRowAtIndexPath但是numberOfSectionsInTableView和numberOfRowsInSection确实设置正确
- 如何获得iOS中的任意线程的正确的帧指针?
- 在Objective-C中返回一个types为id的2D C数组
- MPMediaItemPropertyAssetURL仅为iPhone 5s返回null
- 如何检测MonoTouch中的视网膜显示
- 如何从iPhone摄像头使用图像Exif元数据获取对象的距离?
- 这个声明是什么意思?