前言
swift中可以直接调用c语言,只要包含c语言的.h文件就可以了.
swift调用c语言的方法.
直接包含.h文件, .h文件中写函数声明
//
// CFn.h
// swiftCDemo
//
// Created by 谭迪文 on 2021/6/25.
//
#ifndef CFn_h
#define CFn_h
#include <stdio.h>
void printTest1(void);
int getRandom(void);
#endif /* CFn_h */
.c文件中做函数定义
//
// CFn.c
// swiftCDemo
//
// Created by 谭迪文 on 2021/6/25.
//
#include "CFn.h"
#include <stdlib.h>
void printTest1(void){
printf("C语言中的函数printTest1()运行");
}
int getRandom(void){
return rand();
}
建立桥接文件
这个在建立c语言文件的时候回自动提示是否生成 桥接 文件,直接选是,如果点击了取消,可以手动创建
新建一个.h文件,一般系统自动建立的桥接文件是 项目名+ -Bridging-Header.h,我们也模仿系统起名,SwiftCDemo-Bridging-Header.h
然后build setting -> 搜索 bri, 找到0bjective-C Bridging Header ,然后输入文件名SwiftCDemo-Bridging-Header.h
如下图
桥接文件中包含 c语言的 .h头文件
#import "CFn.h"
swift中的使用
printTest1()
let a = getRandom()
print("随机数a=",a)
在c语言中调用swift的方法
思路是在c语言中定义函数指针,然后,在swift中给函数指针赋值,再在c语言中调用函数指针指向的地址
//
// CFn.h
// swiftCDemo
//
// Created by 谭迪文 on 2021/6/25.
//
#ifndef CFn_h
#define CFn_h
void runSwiftFn(void); //这个函数是用来swift中调用c语言函数的
#endif /* CFn_h */
在.c文件中定义函数指针.注意定义必须写在.c文件中,如果写在.h文件中,如果多次包含.h,就会出现重复定义的错误: duplicate symbol for architecture arm64
下面例子列出2种定义函数指针格式:
- 返回类型(* 函数指针名字)(参数类型) ,这种类型可以为nil,这个是标准c格式是
- 返回类型(^ __nonnull 函数指针类型). 这种格式好像只能在xcode中使用,以前用VC++写代码的时候没用过这种格式,这种格式的__nonnull指定指针不为nil,被swift使用的时候很方便,不用判断是否为nil:
#include "CFn.h"
#include <stdlib.h>
void (^ __nonnull swiftFunP)(int) = NULL;//定义函数指针
void (* swiftFunP2)(int) = NULL;//定义函数指针
void runSwiftFn(void){
swiftFunP(10);
swiftFunP2(20);
}
在桥接桥接文件中声明 函数指针
下面是c语言的声明格式
extern 类型 变量名;
extern void (^ __nonnull swiftFunP)(int);//声明指针
extern void (* swiftFunP2)(int);//声明指针
swift中调用
下面例子的意思写在注释中
swiftFunP = swiftFn(a:)//给c里面的函数指针赋值
swiftFunP2 = swiftFn(a:)
runSwiftFn()//调用c语言中的函数,c语言的函数再调用里面的函数指针,函数指针指向swift中的函数
看下demo的运行结果: