苹果系统开发中的混合编程(2):Swift和C的相互调用

在进行Swift和C之间的相互调用时,有必要先了解一下两种语言之间的类型转换关系:

C 类型 Swift 类型
bool CBool
char, signed char CChar
unsigned char CUnsignedChar
short CShort
unsigned short CUnsignedShort
int CInt
unsigned int CUnsignedInt
long CLong
unsigned long CUnsignedLong
long long CLongLong
unsigned long long CUnsignedLongLong
wchar_t CWideChar
char16_t CChar16
char32_t CChar32
float CFloat
double CDouble

下在还是先演示一下如何在Swift里对C的方法进行调用,创建一个Swift的项目:

在项目里创建C代码文件:

这个时候会提示你是否要生成Bridging Header,选择创建。

文件创建完成后的代码结构如下,可以看到有一个文件名为:<工程名>-Bridging-Header.h的文件,这就是在Swift和C之间进行桥接的文件。

在项目的配置中可以看到这个桥接文件是在这里指定的,所以如果忘记创建了这个文件也不用担心,自己新建一个在这里指定一下就可以了。

实现C的代码:

MyCFile.h

MyCFile.c

在桥接文件中引入C代码的头文件,非常简单,直接import一下就可以了。

然后在swift文件中就可以直接调用C的方法:

下面我们再添加一些代码,来实现两点:

一、C代码中对Swift代码的调用

二、数据的相互传递(以字符串为例)

MyCFile.h

C对Swift方法的调用,其实相当于是注册一个全局的函数指针,可以参见SwiftCallbackFun的定义。

这个里面有一些OC的语法:

^ 操作符,说明这是一个闭包,也就是Block,Swift里的函数都是以闭包的形式传递进来的。

__nonnull 表示对象不应该为空,因为在混编的时候,Swift编译器并不知道一个Objective-C对象到底是optional还是non-optional,所以在Xcode 6.3引入了一个Objective-C的新特性:nullability annotations,这里可以定义为 __nullable 或 __nonnull 。

MyCFile.c

这里有一个对Swift方法的回调。

main.swift

Swift里的代码,要注意的有两点:

一、在Swift里对C中传入字符串处理的方式

二、要先给全局的Callback赋值,这样才能从C里调用到Swift里的方法。

时间: 2024-08-27 16:18:49

苹果系统开发中的混合编程(2):Swift和C的相互调用的相关文章

Linux统系统开发11 Socket API编程2 多进程 多线程 高并发处理

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <纲要> Linux统系统开发11 Socket API编程2 多进程 多线程 高并发处理 UDP服务器 客户端最小模型,处理字符转大写 TCP 多进程并发服务器模型,为每个客户端开启一个进程: TCP 多线程服务器模型,使用wrap函数封装 作业: ---------------------------------------------------- UDP服务器 客户端最小模型,处理字符转大写 [em

Linux统系统开发12 Socket API编程3 TCP状态转换 多路IO高并发select poll epoll udp组播 线程池

[本文谢绝转载原文来自http://990487026.blog.51cto.com] Linux统系统开发12 Socket API编程3 TCP状态转换 多路IO高并发select  poll  epoll udp组播 线程池 TCP 11种状态理解: 1,客户端正常发起关闭请求 2,客户端与服务端同时发起关闭请求 3,FIN_WAIT1直接转变TIME_WAIT 4,客户端接收来自服务器的关闭连接请求 多路IO转接服务器: select模型 poll模型 epoll模型 udp组播模型 线

Python在实时嵌入式系统开发中扮演的五个主要角色-悦德财富

Python已经成为相当热门的程序语言.它以著名的Monty Python喜剧组命名,属于面向对象和解释型语言(非编译型).该属性使得Python具有良好的跨平台性,比如Linux和Windows,或是诸如Raspberry Pi等单板计算机.随着Python的日益普及,人们可能会问,在实时嵌入式系统中是否也有Python的一席之地. 答案是肯定的.下面是开发人员发现Python在实时嵌入式系统开发中有可能扮演的五个主要角色. 作用# 1设备调试和控制 在嵌入式软件开发过程中,开发人员常常需要分

在复杂的项目开发中使用结对编程

在复杂的项目开发中使用结对编程 卢占辉译 在开发软件项目时,不仅写出相应功能的模块很重要:确保写出的模块的易维护性(bug 修复,代码重构)也同样重要. 主打互联网技术和门户网站的Perpetuum 手机公司曾开展了一个长期的软件项目,以研制出一套基于web的内容管理软件.Perpetuum公司的许多开发者都参与了这个项目.项目中大部分复杂的模块都是完全靠个人开发的(非多人协作完成).维护这些模块(即非多人协作完成的模块)非常困难.因为开发某一模块的人还需要开发新的模块或者维护另一既有模块,这需

多人语音直播系统开发中聊天室功能实现方案?

"直播+"不仅是视频.直播平台的尝试方向,也成为众多音乐平台的创新业务,而语音直播正是其中一种尝试.语音直播的用户更偏向年轻化,多为追求新鲜感的90后群体,他们有自己的行为处事方式,喜欢把孤独和无聊的时间用声音的方式宣泄.对于喜爱声音的这类群体来说,语音直播系统开发既保护了他们的隐私又让他们倍感亲切.那么从技术层面讲,多人语音直播系统开发中聊天室的功能实现需要特别注意哪些呢?一.语音直播系统开发的优势是什么?想必有人会问语音直播和传统的电台有什么不同呢?语音直播也有着自己的优势主要有以

java开发中的那些事(6)------一次ajax调用中的问题

这个周末就要到这次开发任务的结尾了,不过也到这时候了,才发现用起来比较顺手了,前几次项目中也有过啊,说起来实实在在用过的才3个项目,就分别用了不同的,着实有些痛苦啊,初学阶段的jsp+servlet还算是初学,可这后面的loushang和ssh2是让我欢喜让我忧啊,高兴的是框架的魅力让我情不自禁,可这样的框架我啥时候才能自己组的那么完善,甚至现在用起来还磕磕绊绊的.总结下这次的大收获的话,一方面是这个框架,另一方面的话就是ajax和json了,这个在我来说是比较陌生的地方,虽然现在我可以用,但原

Android中通过WebView控件实现与JavaScript方法相互调用的地图应用

在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用android方法,在这里我个人觉得有点和DWR相似. 为了让大家容易理解,我写了一个简单的Demo,具体步骤如下: 第一步:新建一个Android工程,命名为WebViewDemo(这里我在assets里定义了一个html页面). 第二步:修改main.xml布局文件,增加了一个WebView控件还有But

二十八、带给我们一种新的编码思路——EFW框架CS系统开发中的MVC模式探讨

回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://pan.baidu.com/s/1eQCc69G       前言:记得最初写出Winform版MVC的代码是在公司的一个产品中,产品有几个界面功能比较多,一个界面窗体的代码尽然有1万多行代码,让我们在维护这几个界面的时候非常的痛苦,你可能想可以把这个大的界面拆分成几个小的界面在集成在一起不就好了,但实际上这样

直播系统开发中互动功能必不可少

现在直播互动已经成为大家比较熟知的交流方式,可以通过直播沟通.学习.宣传.商业等,粉丝经济也是很多人加入主播的一个重要原因,展示自己的魅力,技能,知识,让更多的人了解自己.今天,拓幻科技告诉你,如何搭建一套比较完整的直播体系,直播系统开发中都有哪些直播互动功能? 弹幕直播里面基础的功能,可以带动房间的活跃,有的大主播的房间更是可以看到满屏的弹幕,非常震撼.弹幕是采用 go 写的,可以支持非常高的并发和请求下发,采用 websocket 下发消息,写消息是写到 kafka 集群中,下发消息可以根据