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

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

开源项目文档应规避的13处“硬伤” 李开复:Graph Search将可与谷歌搜索媲美 月成本3500美元 如何在AWS上实现BBVA信用卡低延时分析 外媒眼中的国内互联网巨头:服务器集群庞大但缺乏创新 Facebook主导通用主板+SoC ARM与Intel同台对抗 假如像招聘程序员那样租车…… CrowdStar:Windows Phone 8是开发者的下一片蓝海 腾讯云总经理陈磊透露流量变现计划 将比亚马逊AWS更专注 代码之美——Doom3源代码赏析 英特尔公布2012财年财报 Q4净利润同比下滑27% 谷歌CEO佩奇:创新重于竞争 关注非增量改进 再尝败绩 微软杀软AV-TEST反病毒认证失败 财富:2013最佳雇主 谷歌第一微软75苹果未入榜 移动应用注册表单必死! 数据:2012年的全球互联网知多少 访中粮我买陈伟伟:高并发大压力挑战架构师极限 左路Deep Learning+右路Knowledge Graph,谷歌引爆大数据 数据库排行榜:关系型居首,NoSQL整体人气最高 联通:要做PaaS,存储最低为TB 百度资深交互设计师谈微信4.5版本 TalkingData推出移动游戏数据分析平台 一周消息树:著名计算机黑客Aaron Swartz自杀身亡 使用Windows 8模拟器及Visual Studio 2012调试IE 10触控及响应式Web设计 Azure、AWS要来了 IDC抱团取暖还是各找出路 C#使用ICDBurn实现CD刻录 验证码识别基础方法及C#/.NET源码 傲逆软件CEO周鲁:核心游戏精神,在移动游戏创作中传承 Kim Dotcom推出新文件存储服务平台Mega 用户数一天达百万 美FCC:希望全美在2015年部署千兆以太网 iOS和Android双平台:帷千动媒SDK 3.0发布 移动周报:2013年移动App设计13大精髓 动态显示图片!!!!!! 本人是beginner for vc++,希望以后多交流。现请求一个vc++作的画图程序 大侠执教:投稿程序员杂志要多少时间才有回音? 有办法在控制台程序启动时,隐藏它的DOS窗口吗? 关于MFC中的Project Settings问题 两个编程的初级问题 谁能给我一个关于二叉树的完整的程序。 认识的进来聊天 , 我是东宝 (yeti_lee) 我是一名学生,学计算机(一个普通大学)。请教大家几个问题 大连成绩如何查??有人查到了吗?请聊聊 分是个累赘,我放完它~!来的就有,讲些凄惨的事情和遭遇,大家比谁惨,越惨的给分越多,兄弟我此举是为了找平衡。 怎样得到当前系统打印机的各项信息?????特别是打印纸张方向!!! 高分求救——我有几道C程序的编程题目,望各位高手帮忙解决!谢谢 哪位告诉我select语法,我忘了group by 的使用方法,谢谢! 请问哪儿有电子版的《COM编程精彩实例》,谢谢! 请问:要想学习vb和数据库的知识,哪些书比较好?请各位朋友帮忙推荐几本好书?谢了~! 请问有谁知道PB8编译后打包,PARADOX数据库驱动程序需那些啊????急!!!!!! 在oracle存储过程中怎么使用cursor作为返回值? [TIPS]Win9x和WinNT/2000下面都可以去掉OICQ广告的方法! 触发器问题 关于bdgrid的问题,高手请来,一定高分相送!!!!急 怎么建立WIN2000的域信任关系 用data控件连接DBf数据库时为什么出现“找不到可插入的ISAM”错误? 大家等会儿再吃饭!先看一看这里的送分大餐...... 他们怎么想的?居然没有bcb? 高手指教:如何在vc中控制刻录机和磁带机进行数据备份和恢复? 请问各位高手,怎样才能学好c语言。有没有什么好一点的网站和源码提供,多谢。 如何解决在向量位图背景下的窗口移动是的刷新置后问题?? 问一个问题!爱好or 程序员? 用VB如何设计好的报表,欢迎讨论! messagedlg能不能显示中文?例如显示“确定”,而不是“ok” 各位高手!!请教一个有关在oracle8i中建立表与表之间的关系? 请问哪里有无时间期限的Setup Factory 下载? 笨呆呆,拿分。 请问到那里可以下载uml工具,如果再有推荐的话是一定可以得分的 再次有请: playyuer 吴文智、袁飞、Jneu、Amoon、ttyp、icevi、progame、Jinesc 等各路高手 偶是初学者,问一个问题 SOS,很严重windows的问题,高手快进 复制Access数据库时出现的问题 如何动态添加TQuery的字段??? 编译一问 SOS,很严重windows的问题,高手快进 !!! 有人开发过基于winpcap的网络抓包程序么? SOS,很严重windows的问题,高手快进 ! 通过双网卡上网怎么设置? 一名初学者的问题? 各位老大,如何控制windows的资源管理器显示/不显示后缀名 问一下现在4000元可以买到大概什么配置的笔记本电脑 谁知道用VC++直接操作硬盘?告诉我一声,多谢了 请问考OCP的12本宝典在哪里下载?有人能介绍介绍经验吗?谢谢! Nobody can help me? 成语对对子:流芳百世()精雕细刻()守株待兔()望梅止渴()旗开得胜()瓜熟蒂落() 高中历史必修一的复习提纲全部 求解释下列名词,1%100ml的葡萄糖溶液中1%是指什么、100ml是指溶剂水还是什么 成语对对子:流芳百世 19.某中学学生在课余探讨明清时期的“闭关锁国”政策时,得出了以下结论,其中正确的是( ).A.清朝时开放广州一处同外国通商,说明并不是真正“闭关锁国”B.“闭关锁国”这一政策产生的根 如右图所示,向烧杯内的溶液b中逐滴加入溶液a时,灵敏弹簧秤的读数先逐变小,然后又逐渐变大,则溶液a、b分别是A NaOH、H2SO4 B BaCl2、NaOHC BACL2 NA2SO4 D NH3・H2O、CH3COOH 科代表怎样安排高中历史复习我们高二了,我是历史课代表,我们要复习必修1(人教版),每周早上有20分钟复习,怎么安排全班复习计划, 1.有人说洋务运动“无心插柳柳成荫”这里“柳”指的是什么?引进近代科学技术和出现新的经济因素和阶级力量为什么选后者?2.洋务运动有没有为资本主义发展开辟道路?为什么?3.中国近代资 白糖溶解与水形成糖水是物理变化还是化学变化 成语对对子(反义词) 例如:粗茶淡饭(山珍海味)守株待兔( ) 狗仗人势( )望梅止渴( )水落石出( ) 高中历史必修二复习提纲 请问 初中历史和高中历史 有区别吗? 成语反义词对对子固若金汤( )指鹿为马( )伶牙俐齿( ) (1)NaCl晶体融化时需要克服的作用力是_____… (2)NaCl晶体中,离子键的键长为____,Na+的半径与Clˉ的半径之比为______ (3)NaCl晶体的每个晶胞中有____个Na+,____个Clˉ.(4)As的价电子排布式为___ 一到化学题,解释为什么不选b我觉得二氧化碳和氢氧化钠反应了,那么试管的力的气体变少,那么在大气压的作用下,氢氧化钠就会上去. 融化和熔化的区别? 由于预习阶段,有些概念还不懂,还请前辈们多多指教呢. 化学这题为什么选C求解释 融化和熔化有什么区别? 高中历史必修一复习提纲 人教版 请说明原因,我觉得它选B 融化、溶化、熔化的区别,并各造一句话 融雪剂NaCl使冰雪融化是什么变化? 水能溶解五水硫酸铜吗 是什么变化物理还是化学 融化,熔化的区别是什么 融化氯化钠的颜色如果将氯化钠加热融化后是什么颜色的?氯化钠熔点800多度呢2l不可以吧 把什么物质分解是化学变化吗 高中历史总复习提纲 化学有机选择题一题,麻烦详细讲解下,有图 全册的, 熔化状态和熔融状态有什么区别?(化学方面)RT,看到一本书上写离子反应在溶液或熔融状态下反应,另一本说溶液或熔化…… NaCl熔化算不算化学键被破坏?为什么? 经典力学的主要内容是什么? 凿壁偷光,精忠报国,指鹿为马,纸上谈兵,闻鸡起舞,破釜沉舟,程门立雪,写出 熔化 溶化 融化 都有什么不同?熔化是一样的吗?溶化是一样的吗?融化 融解是一样的吗? 为什么熔融NaCl会破坏化学键?不太,不太明白, 凿壁偷光 指鹿为马 纸上谈兵 精忠报国 闻鸡起舞 入木三分 鞠躬尽瘁 破釜沉舟 高山流水 黄袍加身 的主人公 材料一 天下多男人,尽是兄弟之辈;天下多女子,尽是姐妹之群,何得存此僵彼界之私,何可起尔吞我并之念.——洪秀全《原道醒世训》,1843年材料二 逆贼洪秀全杨秀清称乱以来,於今五年矣.荼 关于熔化时破坏化学键的一道题现有 1.氯化钡 2.金刚石 3.氯化铵 4.硫酸钠 5.干冰 6.碘片 一 熔化时不需要破坏化学键的是熔化时需要破坏共价键的是熔点最高的是 最低的是 二 属于离子化合 指出在中国实现民族独立后,共产党为实现民主政治所做的努力 谁有下面这个高中历史第一轮复习的文件? 融化时破坏的化学键 氯化氢 蔗糖 为什么融化不会破坏化学键?怎么判断融化会不会破坏化学键?还有怎么判断溶解破不破坏化学键?氯化氢不是共价键吗?完全搞不清楚. 各位!溶化,融化,熔化这三个词怎么区别? 熔融 熔化 溶解区别是什么? NaCl溶解在水中时,化学键有没有断? “融化”,“溶化”,“熔化”,三词的区别如题 溶解和熔化有什么区别嬷?从化学角度咯,最好举例子嘞~ 盐撒在冰上,请问冰为什么能融化成水, "溶化"和"熔化"这两个词有什么区别? 水落石出现一五十是什么生肖 磁流体是电子材料的新秀,它既具有固体的磁性,又具有液体的流动性.制备时将含等物质的量的FeSO4和Fe2(SO4)3的溶液混合,再滴人稍过量的氢氧化钠溶液,随后加入油酸钠溶液,即可生成黑色的、 溶化,熔化,融化的区别是什么? 熔化和溶解有什么区别? 高中历史内容与初中联系大主要讲什么有必定接洽点然则高中汗青是从理论上开端分析初中纯感性熟悉 .至于内容大年夜体是差不多的但有些处所会加深外国史相对初中而言变多根本上就如 流芳百世,良药苦口,水落石出,雪中送炭,精雕细琢,守株待兔,卸磨杀驴,伶牙俐齿的反义词. 高中历史必修一的复习 高中历史有哪几块内容? 成语对对子 流芳百世( ) 井然有序( ) 精雕细刻( ) 固若金汤( )(注意对仗要工整,意思要相对) 高中历史必修一复习提纲简洁,易懂 就是在有材料的简答题后回答的那种
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn