混合使用Swift,Objective-C, C++, Objective-C++

来源:互联网 发布:数据库概论答案 编辑:程序博客网 时间:2024/06/01 10:00

这个话题并不是一个新的话题,网上有前辈做过详细的描述(Mixing Objective-C, C++ and Objective-C++: an Updated Summary)。之所以做为一篇文章,是因为在实际项目中用到了这种混合,加以记录。

首先需要澄清的是,Objective-C是strict superset of C. C++是基于C语言的面向对象的扩充,但不是strict superset of C. Objective-C++是Objective-C的扩展,使得Objective-C可以链接C++代码。通常情况下,要使用Objective-C++,需要将XCode中.m源文件改成.mm源文件。


其次需要澄清的是,Objective-C代码跟C++代码是不能混合使用的,也就是说,Objective-C的头文件中是看不到C++的头文件的。当然,C++的头文件是看不到Objective-C的头文件的。只有Objective-C++文件(也就是.mm文件)可以看到Objective-C的头文件和C++的头文件。

正因为Objective-C和C++互相不能见到对方的头文件,那么就意味着,现有的C++的代码库,想要在Objective-C中使用,是需要封装的,通常,这种封装是借助于Objective-C++写成的Wrapper.

另一方面,Wrapper本身也有技巧,那就是使用Objective-C的class extension特性(或者使用Pointer to implementation设计模式),避免将C++头文件暴露给Objective-C(否则无法编译通过)。具体细节可以参考文章开头的链接。

最后,如今Swift正在取代Objective-C,成为iOS开发的主流语言。需要澄清的是,Swift可以借助Bridging-Header文件与Objective-C互通(双方可以互相看见对方的类),同样的,也可以与Objective-C++文件互通,但是,Swift无法通过Bridging-Header文件与C++文件互通。

正因为Swift无法与C++互通,所以,对于Swift开发的产品,如果想要使用现有的C++代码库,必然要引入Objective-C++文件。

另一方面,需要澄清的是,Swift中的类,并不是完全与Objective-C(++)互通的。最直接的例子是Swift中的Optional特性。该特性在Objective-C的世界没有对应。也就意味着,即使通过Bridging-Header连接,Objective-C中依然无法看到Swift中的Optional的Field. 这个差距使得想要在Swift中使用C++(或者说Objective-C)变得复杂,往往不得不引入一个converter来处理Swift类的Optional特性的域。

原创粉丝点击