swift和c语言互相调用教程

54 篇文章 1 订阅
47 篇文章 1 订阅

前言

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的运行结果:
在这里插入图片描述

demo下载点击我

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值