在写cocos2dx引擎游戏时,试验了一下swift和c++的混编,swift可以与OC混编,C++可以和OC混编,那么是不是c++也可以调用swift的代码呢?大家都知道,swift刚刚面世,还有很多问题存在,尽管相对于OC来说,swift语言更加简便,但是同时问题也不少,所以我们借此来探究混编中具体会出现的问题
如题目所说,swift与C++混合编程,必定需要用OC作为一个中间接口,来衔接这两种语言。先简述一下两种混编的机制(swift与OC混编,OC与C++混编)
swift和OC婚变机制:因为swift没有头文件,swift的调用都是依靠直接获取,而非头文件引用,所以它们混合编程的具体实现就是:swift需要桥接文件,将OC头文件引入其内部,用以swift调用OC代码。OC则需要通过-swift.h文件来声明swift中类的头文件定义,用以OC调用swift代码。
OC和C++混编的机制:OC和C++混编要求就是通过互相引用头文件来实现相互代码的调用,唯一要求是——若是C++引用OC代码,那么OC头文件内不能有任何OC的代码
貌似通过以上两种机制,我们可以设想——以OC作为媒介,我们似乎就可以实现关于C++和swift的混编了。
然而事实上并非这么简单,因为在实验过程中,可以发现,会出现很多编译类的报错,同时会出现很多问题。问题的原因就在于OC和C++混编机制,OC头文件内不能存有任何OC代码。大家可能会觉得这个对于混合编程并没有太大的影响,但是在实验中就发现,在swift和OC进行数据传输的时候,混编就会出现乏力的现象
在此,我举一个例子来说明一下:
我们设定:class Coffee//用以存储咖啡的信息,包括name area等数据(swift实现)
class CoffeeInfo//用以上层获取咖啡的信息(swift实现)
很简单,我们只要设置class Coffee这个类,在内部声明 name,area等变量即可。同时我们在classCoffeeInfo中添加funcgetCoffeeInfo(name:String)->Coffee即可通过getCoffeeInfo获取到咖啡信息并返回
这样看起来很容易,接下来我们尝试添加OC接口来尝试一下用OC调用swift
我们继续设定:OC_getCoffeeInfo.h和OC_getCoffeeInfo.mm
OC_getCoffeeInfo.mm中我们可以写如下内容:
#include "XXX-swift.h"
Coffee CoffeeInfo_get(Char*name){
CoffeeInfo *info = [[CoffeeInfo alloc]init];
Coffee coffee = [infogetCoffeeInfo:name];
return coffee;
}
接下来我们来写.h文件:
#include "XXX-swift.h"
Coffee CoffeeInfo_get(Char* name);
写完头文件我们就会发现问题,如果我们OC作为接口,那么OC的头文件内就不应该有OC的相关代码,否则C++无法直接调用OC的代码,但是我们又有相关的数据传输,那我们怎么能不引入Coffee头文件返回他呢?所以必须引入-swift.h文件,此时却因为头文件内有OC头文件引用而显示此头文件不能被编译。。。这就造成了关于混编的尴尬局面
如何解决这个问题呢?这里我通过运用vo/po包的机制来解决了数据传输的具体问题
—————————具体解决方法下一篇再说吧,写不动了……TwT———————