在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在Object-C程序有两种文件.m和.mm文件。
所以当需要在Object-C中调用C++时,可以将.m文件直接重命名为.mm文件,这样就可以使用C++的语法和内容了。 如在main.mm文件:
1 #import <Foundation/Foundation.h>
2 #import <iostream> //这里不是用include C++的头文件,而是使用import 3 int main(int argc, const char * argv[]) { 4 @autoreleasepool { 5 std::cout<<"hello CPP"<<std::endl; //完全是C++的语法 6 } 7 return 0; 8 }
2 Swift调用Objective-C在Swift文件中要使用Object-C的内容,需要创建一个桥接头文件,通过桥接头文件实现Object-C语法到swift语法的转换,从而以swift的语法,在swift文件中调用Object-C的函数或类等内容。桥接头文件的命名规则是:<工程名>-swift.h。 若需要在Swift中调用Object-C可以按如下步骤操作:
如在swift环境中需要创建Object-C类的对象:
@interface testObjectC : NSObject
-(NSString*)sayHello:(NSString*)greeting withName: (NSString*)name; @end
#import "testObjectC.h" //以Object-C的语法import相应的头文件,目前只需import一个文件
override func viewDidLoad() {
super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var obj : testObjectC = testObjectC(); //仍按swift语法调用Object—C的构造函数 var hello = obj.sayHello("Good morning", withName:"Tony") }
3 Swift调用C在swift文件中调用C语言,与在swift文件中使用Object-C类似,同样只需在桥接头文件import相应的头文件即可。 3.1 简单实例如下是在Swift环境中调用C语言的函数:
#include <stdio.h>
void printC(int a); //在C语言头文件的声明,在testC.c文件中还有实现。
#import "testC.h" //还是以Object-C语法import所需要的C语言头文件
printC(2); //直接以C语言的语法调用
3.2 类型转换由于swift和C两种语言的数据类型定义不完全相同,特别是在C语言中有指针的类型,而在swift中切没有,为了能够在swift环境中调用C语言的API函数,所以Apple在swift环境中定义了一些数据类型,从而能够以C语言的类型一一对应。 3.2.1 基本类型如表 1所示是Swift环境中C语言调用API函数的数据类型映射表,即若要调用C语言的API,则需要定义表中左边的类型。 表 1
3.2.2 指针类型由于在swift中没有指针类型,而C语言中存在指针。所以为了调用带有指针类型的C语言API,定义了表 2中swift指针类型。其中表 2中的Type是表 1中左边swift的基本类型,并且其可以用于返回值、变量和参数之间的转换。 表 2
在C语言中的指针需要手动进行申请空间和释放空间,同样在swift语言中也需要手动进行操作;同时在C语言中还可使用"*"取得指针所在定址,而在Swift中若需要进行赋值和取值,则需要取用相应的方法。 表 3
比如在定义的C语言的函数对指针的值进行修改,通过在swift环境中取得指针的值:
void testPoint(int* a)
{ printf("%d\n",*a); *a = 44; }
3.2.3 字符串由于C语言的字符串可以简单分为两种:const和非const,所以swift与C语言之间的对应关系如所示。 表 4
虽然swift与C语言之间存在字符串的对应关系,但还需考虑UnsafeMutablePointer<CChar>或UnsafePointer<CChar>类型与swift语言的String字符串之间的转换。
要将swift语言的String字符串转换为C语言的UnsafePointer<CChar>或者是UnsafeMutablePointer<CChar>,需要Object-C的NSString作为转换中介。
图 1
要将C语言的Unsafe Pointer<CChar>转换为swift语言的String,就不需要Object-C作为中介的,直接调用String类型的fromCString()函数就可以直接转换为Unsafe Pointer<CChar>。
图 2
4 swift调用C++
目前无法直接调用,需要一些特别的技巧。若需要可以通过Object-C对C++进行包装,然后在swift中调用Object-C,既以swiftàObject-CàC++这样的顺序调用。 5 参考文献
|
请发表评论