说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Swift与Objective-C的兼容“黑魔法”:@objc和Dynamic

HTML文档下载 WORD文档下载 PDF文档下载
Cocoa框架早已烙上了不可磨灭的OC印记,而无数的第三方库都是用OC写成的,这些积累无论是谁都不能小觑。苹果采取了允许开发者在同一个项目中同时使用Swift和OC进行开发的做法,但要想实现互通,又需添加哪些桥梁?

虽然说Swift语言的初衷是希望能摆脱Objective-C的沉重的历史包袱和约束,但是不可否认的是经过了二十多年的洗礼,Cocoa框架早就烙上了不可磨灭的Objective-C的印记。无数的第三方库是用Objective-C写成的,这些积累无论是谁都不能小觑。因此,在最初的版本中,Swift不得不考虑与Objective-C的兼容。


Apple采取的做法是允许我们在同一个项目中同时使用Swift和Objective-C来进行开发。其实一个项目中的Objective-C文件和Swift文件是处于两个不同世界中的,为了让它们能相互联通,我们需要添加一些桥梁。

首先通过添加{product-module-name}-Bridging-Header.h文件,并在其中填写想要使用的头文件名称,我们就可以很容易地在Swift中使用Objective-C代码了。Xcode为了简化这个设定,甚至在Swift项目中第一次导入Objective-C文件时会主动弹框进行询问是否要自动创建这个文件,可以说是非常方便。

但是如果想要在Objective-C中使用Swift的类型的时候,事情就复杂一些。如果是来自外部的框架,那么这个框架与Objective-C项目肯定不是处在同一个target中的,我们需要对外部的Swift module进行导入。这个其实和使用Objective-C的原来的Framework是一样的,对于一个项目来说,外界框架是由Swift写的还是Objective-C写的,两者并没有太大区别。我们通过使用2013年新引入的@import来引入module:

@import MySwiftKit;

之后就可以正常使用这个Swift写的框架了。

如果想要在Objective-C里使用的是同一个项目中的Swift的源文件的话,可以直接导入自动生成的头文件{product-module-name}-Swift.h来完成。比如项目的target叫做MyApp的话,我们就需要在Objective-C文件中写:

#import "MyApp-Swift.h"

但这只是故事的开始。Objective-C和Swift在底层使用的是两套完全不同的机制,Cocoa中的Objective-C对象是基于运行时的,它从骨子里遵循了KVC(Key-Value Coding,通过类似字典的方式存储对象信息)以及动态派发(Dynamic Dispatch,在运行调用时再决定实际调用的具体实现)。而Swift为了追求性能,如果没有特殊需要的话,是不会在运行时再来决定这些的。也就是说,Swift类型的成员或者方法在编译时就已经决定,而运行时便不再需要经过一次查找,而可以直接使用。

显而易见,这带来的问题是如果我们要使用Objective-C的代码或者特性来调用纯Swift的类型时候,我们会因为找不到所需要的这些运行时信息,而导致失败。解决起来也很简单,在Swift类型文件中,我们可以将需要暴露给Objective-C使用的任何地方(包括类,属性和方法等)的声明前面加上@objc修饰符。注意这个步骤只需要对那些不是继承自NSObject的类型进行,如果你用Swift写的class是继承自NSObject的话,Swift会默认自动为所有的非private的类和成员加上@objc。这就是说,对一个NSObject的子类,你只需要导入相应的头文件就可以在Objective-C里使用这个类了。

@objc修饰符的另一个作用是为Objective-C侧重新声明方法或者变量的名字。虽然绝大部分时候自动转换的方法名已经足够好用(比如会将Swift中类似init(name: String) 的方法转换成-initWithName:(NSString *)name这样),但是有时候我们还是期望Objective-C里使用和Swift中不一样的方法名或者类的名字,比如Swift里这样的一个类:

class 我的类 {    func 打招呼(名字: String) {        println("哈喽,\(名字)")    }}我的类().打招呼("小明")

Objective-C的话是无法使用中文来进行调用的,因此我们必须使用@objc将其转为ASCII才能在Objective-C里访问:

@objc(MyClass)class 我的类 {    @objc(greeting:)    func 打招呼(名字: String) {        println("哈喽,\(名字)")    }}

这样,我们在Objective-C里就能调用 [[MyClass new] greeting:@"XiaoMing"] 这样的代码了(虽然比起原来一点都不好玩了)。另外,正如上面所说的以及在Selector一节中所提到的,即使是NSObject的子类,Swift也不会在被标记为private的方法或成员上自动加@objc。如果我们需要使用这些内容的动态特性的话,我们需要手动给它们加上@objc修饰。

添加@objc修饰符并不意味着这个方法或者属性会变成动态派发,Swift依然可能会将其优化为静态调用。如果你需要和Objective-C里动态调用时相同的运行时特性的话,你需要使用的修饰符是dynamic。一般情况下在做App开发时应该用不上,但是在施展一些像动态替换方法或者运行时再决定实现这样的 "黑魔法" 的时候,我们就需要用到dynamic修饰符了。在之后的KVO一节中,我们还会提到一个关于使用dynamic的实例。

作者:王巍(@onevcat),iOS和Unity3D开发者。

本文转载自:Swifter

点击链接进入Swift技术社区,了解更多Swift开发的技术热点内容!


CSDN JOB移动工程师专场招聘,直击20家企业高薪职位-->http://job.csdn.net/event/mobdev.html

在VB中模拟实现邮件传输 在VB中实现文件上传 在VB中使用UDP协议 在VB中用Outlook发电子邮件 在程序中打开 Internet 拨号连接窗口 -VB资料 在一个单位内部或通过广域协议(如X.25)互联的行业内部都有几十或上万台计算机互联,用Intrane 在应用中集成浏览器-VB资料 在桌面上建立一个 Internet 快捷键 -VB资料 VB怎样接收电子邮件(POP3协议简介) VB怎样用VB得知系统当前是否处于internet链结状态 VB制作自己的网络搜索软件 自动更新工作站的应用程序-VB资料 自己的IE——用VB制作浏览器 VB6制作Win98风格的工具栏 VB实现窗口的弹出式菜单 用VB做个漂亮的进度条 Cool 3D 浮動按鈕的模擬作法-VB资料 VB 5.0中实现鼠标拖放 VB5.0下工具条的制作 VB5.0中基于桌面的屏幕技巧 VB5.0中实现字体闪烁效果 VB5实现窗口图像缩放、滚动技巧 VB6.0动态加载ActiveX控件漫谈 VB编程步步高-表单篇 VB编程常见问题 VB编程中如何锁定鼠标 VB创建位图菜单 VB实现按钮浮动效果 VB应用程序中的工具提示和状态显示 VB中处理长列表框项的两种方法 VB中多级下拉列表的实现 快去微软件聊天室了,开聊了。 from表单中的参数无法传递? 急!急!急!急!急!我安装Visual studio 6.0中文版不能够成功,是什么原因?? 关于Oracle的数据类型问题? 请问在vc中怎样创建Outlook对象 关于Cable Modem,高手指点。 毕业论文怎么作??????????? 新手送分(解决即给分) 天生爱吃冰激凌! 江湖告急!!!!! 整理 FAQ 的时候 为什么 总是出现 贴子内没有这个人的回复!!!:xxxxx 如何删除一段时间的记录?????(兄弟们帮帮我) 关于 Treeview控件,请高手指教。 推荐好书 Borland Delphi 6 中文企业版哪里有免费下载????????????????????500分 ADO中同一个Connection打开的RecordSet个数有没有限制? 我请教一个关于恢复数据库的问题!!!急急 关于特殊字符的问题!!!!!!!!! 要同时以cascade风格显示10个MessageBox对话框,请问有无可能? 如何用windows2000收发传真? yangjf接分 ASP.NET如何调用mschart asp.net中利用owc10生成了一个EXECL文件,但是不知道如何控制字体大小,及单元格的边框 数据库问题,请高手指点。 本人基础较差,刚刚学习c++,请教一个简单问题!!!! 为什么从左侧树状菜单进入论坛显示时 所有的 情形都是2月28时的贴子状况 笔记本安装SQL Server 2000老出问题 CSDN邮件期刊用什么打开呀?? 怎样用java把数据库里读出来的数据按自己定义的格式写入一个word文件 请问高手,PB7窗口属性面版里的窗口颜色下拉列表中的自定义如何使用。我看到有四个custom,怎样设置,多谢。 关于j2ee服务器定位模式(Service Location pattern) 在网页中怎么样直接运行可执行文件? ORALCE中的首选身份证明的问题 Collections 添加元素,怎样指定添加的位置?我想添加到最开始。 关于字符串长度的问题,我想len("ab你好")=3,而不是等于4,即将虑大小写和数字的问题 listview中怎样根据key ,找到这个listItem 12台计算机要接入宽带,怎么实现?马上散分!!!!! 十万火急!ddvboy、daniel007、sweethzp大虾请进,用Epson-LQ1600K打印381*297工资条,使用QuickReport,选A3纸,预览正常,可平打印右 公共IP问题 把图片存进SQL中??? 看过深入浅出mfc的同志进来看一下。 CDC画图一问,在线等待,谢谢! CFileFind为什么列不出网上邻居的共享目录的文件? 散分的如施舍,似炫耀!接分的如祈求,似可怜! LINUX的播放器咋这么傻啊 如何将小数转成整数,请看例子: 请问哪里有处理微积分等数学运算的控件? sos!!!打包软件!!!! 请问C++编程思想第二版有中文电子版吗? 一个困扰了我很久的问题,关于用BDE连SQL SERVER,请大侠请教? update() 单位受力面积是谁吗意思?新上物理它给了这么个定义,单位受力面积的质量为压强.解释一下到底什么意思,我最迷惑的就是‘单位’是谁吗意思,这一句怎么就可以表示,压强的公式P=F/S,高手解 位于长江上游的大型水利枢纽A小浪底B葛洲坝C三峡D丹江口 地球轨道为什么是椭圆的? 如果我站在半空不受地球引力影响的话,在中国一天后会在那里? 长江水能资源丰富,蕴藏量占全国的(),主要集中在()河段,建成了世界最大的()水利枢纽. 地球轨道是椭圆,太阳在一个焦点上,为什么没有在另一个焦点上也有一个太阳.这里地球和太阳泛指宇宙中同类星球.就是说为什么只有一个焦点有,另一个焦点没有星球?无 j假山好做吗 用向量自回归模型之前需要做ARCH异方差检验吗? 保险股票债券储蓄这四种那种是针对风险的投资方式,我说的是针对风险的投资,不是那种风险最大la 初一期末试题 还有 你们觉得地理难吗 我学得好困难 求助一元回归模型没有异方差是不是就意味着没有其他影响因素啊 公司地面铁板碰到水就生绣,有什么好的办法清除铁绣 田园风光的作文应该怎么写? 细菌性感冒如何治疗 喝绣水会补铁吗? 怎样 写田园风光的作文 方差的公式 为什么铁会生绣 洗衣粉的说明书快 养细菌最好的办法是什么?... 染织企业生化池的细菌究竟怎么样可以养的最好.请大家给点意见 比较三类生态研究方法的利弊? 洗衣粉能杀死哪些细菌 基础化学(案例版)课后习题解答作者 席晓岚医学生用书 求问:一种绿色的,高一米左右,杆花纹长得像蛇一样的树(或许是草本植物).叶,杆皆翠绿色,较矮,高度在几十厘米到一米五之间左右,长果实的杆则细长笔直而圆,杆直径三四厘米左右.杆表皮 怎样用实验证明细菌被杀死?尽量用实验室的器材,并能说明相关步骤.我的实验是:什么物质可以杀菌。但不知道该物质和细菌接触后是否有杀菌抑菌的效果,所以才提供以上问题。求答案在 603《基础化学》 科学出版社,2006年6月 李保山主编 是哪一本书啊?第一版还是第二版. 动能和动量有什么关系?为什么动能的导数为动量?请讲详细一些, 关于我国工业的叙述,正确的是①我国最大的煤炭基地是陕西 ②京津唐地区煤、铁、石油等矿产资源丰富,是我国北方最重要的重工业基地 ③位于黄河流域的钢铁基地有包头、太原等 ④上海 P(k=x)=(ab^k)/k!且期望E(X)=2,求常数a,b. 有哪些蛇是绿色的有哪些种类的蛇是绿色的?我只知道绿曼巴和竹叶青~越多越好哦~ 铝合金 哪些铝合金不仅强度高质量轻适合做受力构件 比如做舷梯 我国棉纺织业,今后的技术发展方向是怎样的?对于棉花的品质要求会有怎样的转变? 在医疗中,我们一般用什么方法杀死细菌和真菌? 描写中华儿女报效祖国的文章!马上就写!读后感 西双版纳的人文地理云南西双版纳的气候环境好吗?做火车什么多长时间? 世界上没有两片相同的树叶 有感作文急用 如图所示为甲乙丙三个物体相对同一位置的位移图像,他们向同一方向开始运动,则在时间t0内,下列说法正确的A他们的平均速度相同B甲的平均速度最大C.它们的平均速率相等D乙和丙的速率相等 初二地理——云南的西双版纳有没有【黑熊】?到底有没有黑熊?我刚做了地理卷子上有一道选择题,老师对过答案【黑熊在林间觅食】是错的,这是为什么? 树叶的回音 感悟 高手进. 在线等.急~~~~~转眼就到了大四,大家就要天南地北地实习去了.离校那天,当我狼狈地拖着大大小小的行李走出宿舍楼时,我呆住了.班里的男生都在,他们是来送我的!男 如图2所示,A、B、C是三个质点同时同地开始沿直线运动的位移-时间图像,则在时间t2内A.A和B的平均速度相等B.B和C的平均速度相等C.B的速度最大D.它们的平均速度都相等 生态学模型建立的一般步骤以及一般方法是什么? 赏析、感悟:曲曲折折的荷塘上面,弥望的是田田的叶子.叶子出水很高,像亭亭的舞女的裙.层层的叶子中间曲曲折折的荷塘上面,弥望的是田田的叶子.叶子出水很高,像亭亭的舞女的裙.层层的 (双选)物体A,B的s-t图像(位移时间图像)如图所示,由图可知A、A.B两物体都在做匀加速直线运动B、A物体的运动速度大于B物体的运动速度C、两物体的同时从同一位置出发D、两物体的运动方向 无线电波是干什么的? 一片树叶 对生与死的感悟 是不是光的频率越高就穿透物体能力越强?声呢? 关于无线电波首先无线电波能传送数据吗?就是一些平时靠人工记录的数据,电脑记录然后通过无线电波发送出来.其次如果能传送接收,应该是不收费的吧? 扫描隧道显微镜是怎么清楚的探测物体表面的原子的? γ射线频率那么大,为什么穿透能力强?紫外线频率大,穿透能力弱,因为易发生折射和全反射.红外线频率小,穿透能力强,因为不易折射.不是频率越大越容易发生折射和全反射吗?穿透能力弱吗?为 茂密的树林可以阻挡沙尘暴,可以挡住洪水,还可以. 用扫描隧道显微镜才能观察到原子在固体表面的排列情况,可得出结论A原子是一个实心球体 B原子是静止不动的C原子是真实存在的肉眼是看不见的粒子 D原子空间有很大的空间 高二导数题.若作直线运动的物体在[t,t+△t]时间内位移的变化量△s=t3(△t)-3t2(△t)2-(△t)3若作直线运动的物体在[t,t+△t]时间内位移的变化量△s=t3(△t)-3t2(△t)2-(△t)3,则该 一个做直线运动的物体,某时刻的速度是10m/s,那么这个物体A.在着一时刻前0.1秒内的位移一定是1米B.从这一时刻起1秒内的位移一定是10米 C.从这一时刻起10秒嫩的位移可能是50米 D,如果从这一时 通过扫描隧道显微镜(STM) 能说明原子还可以再分吗 物理电磁效应 理论推导 BVq是啥E=BLV energy=BLVq F=energy/X=BLVq/X=BLXq/tX=BILBVq是啥 理论是啥 一个作直线运动的物体,某时刻的速度是10m每秒,那么这个物体在这一时刻之前的1s内的位移可能是10m是否正确 为什么在扫描隧道显微镜下的苯分子只能看到三个碳原子 引发尿路感染的细菌有哪些? 下大雨之后为什么会出现彩虹 什么是地球椭圆轨道? 北京再陷雾霾空气达六级严重污染 明日义乌连发两起命案 一人炸死一人被捅死世界最高人举行婚礼 夫妻身高相差77安倍宣称福岛污水泄漏得到控制 逾8成美国网络销售辱华面具与服饰 迎接万圣美国最新研究称分析人类口腔细菌可知其日本:转基因食品进口大国央视曝中国富豪相亲会内幕 爱钱美女惨北京中心城区今日空气达6级严重污染 哥伦比亚反政府武装释放一名美国人质第五届全球化时代犯罪与刑法论坛在北京日本拟引进上百架美国无人机“监视”钓日媒:安倍访土耳其将游说土方勿购买中今日海外关键词(10月28日):语言网上零售成为西方企业进军中国的新通道土耳其总理:只有中国退出才可能购别国LG曲面手机G Flex亮相 11月马来西亚众人集体练瑜伽 欲创吉尼斯纪党报评陈永洲事件:有职业操守才有媒体(今日海外言论 10月28日)安倍:悉尼歌剧院40周年庆典 丹麦王储携王演绎武汉街头文化世界最高双子塔并未报建上海两中学生 为救落水同学溺亡143年前 英国旅行家拍黄鹤楼照片顾客驾车冲进餐厅马路边井盖“喷泉”三天 原是医院水杰队永远不会独行 苏牙和亨利与你同中国坚决反对海洋霸权驾驶员被拘3日梅西和教练谁说了算我市向全体工会会员 发放服务卡陪考家长6次被索要电话美国计划2019年伸手摘星每日提醒举报网上暴恐音视频 最高奖10万元天天都有“重口味”超九成市民为卫生状况点赞希斯菲尔德:压力摧垮瑞士队员 面对法有多少人在凑热闹作文材料曾是4月调考题迟到的中考
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘