入职新公司后,接手了一个Swift项目。项目质量已经吐槽过一次就略过了,感兴趣的可以看我之前的博客。当然我之前对Swift只是略有了解,略到只看过没写过的程度,主要语言还是OC。不过嘛其实语言都是相通的,何况方法都是相同的只不过语法上可能有点儿小差错。不过仍然有些东西会莫名其妙被卡住。

  比如创建一个UIButton,OC中我们一般使用  [UIButton buttonWithType:UIButtonType]  这个构造方法来快速初始化并赋予UIButton的type属性,当然也有一个原因是UIButton的type是read-only属性,我们只能在初始化方法中去设置它。那么Swift中怎么写呢?

  答案是  UIButton.init(type: UIButtonType)  。有没有感觉常见的方法参数变的很别扭?不过慢慢的就习惯啦。其余的比如“中括号+空格”的调方法语法改为全部“.”出来,语句结束若换行则不用加";"等等等等吧。不过本篇并不是Swift与OC的开发过程中的语法比较,而是两者怎么桥接,所以切回正题啦。

  1.Swift中调用OC的类与方法

  在正式开始接手项目之后,需要添加UITableView的下拉刷新、上拉加载和等待窗口HUD的功能。几乎所有的项目中都涉及到这样的功能,对我们来说实在是太简单了。使用系统控件UIRefreshControl自己手写固然麻烦,但我们有极其方便李明杰的MJRefresh三方框架来一句话添加下拉刷新与上拉加载(非广告,我也不是跟李明杰学的,不过这个刷新控件确实不错,节省时间)。至于HUD,我们一样扔掉了UIProgressView控件来使用MBProgressHUD三方框架添加等待HUD。这简直没有难度嘛。

  等一下,好像少了点儿什么。

  我们是用Swift开发的工程啊,而上述两个三方框架与许许多多成熟的三方框架,几乎都是使用的Objective-C封装的。支持Swift这种不断更新的语言的三方框架很少。

  摆在面前两条路,自己使用系统控件封装,或者研究下Swift类中怎么调用Objective-C的类。

  尝试了下使用UIRefreshControl来封装下拉加载。做确实是做出来了,不过 1.样子很丑;2.刷新不敏感;3.需要等待HUD还需要自己封装。虽然可以实现但是对于强迫症来说,习惯了MJRefresh的快捷高效再来使用这个,简直难受的不要不要的。

  终于到主题了,桥接。

  我们知道Swift中自定义的类不需要导入头文件,编译器会自动帮我们导入。那么Objective-C怎么做呢?

  跟着网上教程,当我们创建以Swift为语言的工程后,在第一次创建或拖入OC语言的文件时会自动弹出一个对话框,如下:

  该提示的意思是,是否创建一个Objective-C bridging header,也就是创建一个Swift中能调到OC的桥文件。我们点击回车,会自动创建一个名叫  你的项目名(默认)-Bridging-Header.h  的头文件。这文件是干什么用的呢?

  我们点开这个文件,里面只有这样一行注释:

  以我不怎么样的英语造诣,直译如下:

  使用这个文件来导入你想导入到Swift中的(OC)目标头文件.h。

  简单明了。接下来怎么做?

  直接在这个文件中导入头文件,之后你可以在Swift语言中直接使用,就像Swift类一样。

导入头文件:

Swift中调用:

  大功告成。

  另外有一点,若你导入头文件后仍然无效,那么除了编译下看看效果之外,还可以设置下项目的Target - - Build Settings--Swift Compiler--Objective-C Bridging Header内容为你的项目名字(默认)/Bridging-Header.h,这个与Bridging-Header.h位置有关,从项目的根目录开始在Objective-C Bridging Header选项里面写入Bridging-Header.h相对路径。

  2.Objective-C中调用Swift

  在上述问题成功解决后,老板给了另外一个任务,让我把外包公司做的另外一个完整的功能整合到我现有的App中。看了下界面不是特别难,但拿到代码就傻眼了,又变成OC了。

  在向老板抗议无果后,硬着头皮添加。在经历了缺少各种文件的error后,功能文件经过一个上午被我整合在了一起。但最大的问题出现了,如何在OC中调用Swift文件?

  首先,我们需要到Target - - Build Settings--Packging--Defines Module,将值改为YES。

  然后,我们到所想要调用Swift类的OC类中,调用这样一个头文件:

  #import <你的项目名-Swift.h>

  若你没有修改,一般都是你的项目名。你可能会想,我并没有创建这样一个头文件。但是要仔细看,它使用的是尖括号<>,这说明它是系统类,你是看不到的。

  完成,尽情使用任何你想用的Swift类吧~

OC与Swift桥接问题的更多相关文章

  1. oc 与 swift 之间的桥接文件 (ProjectNmae-Bridging-Header.h) (ProjectNmae-Swift.h)

    oc 与 Swift 是2种不同的语言, oc代码只能写带oc文件里, Swift代码只能写在Swift文件里, 虽然2者不同语言, 但却能互相调用, 不过需要进行一下桥接, 就是下面的2个文件 (P ...

  2. IOS --- OC与Swift混编

    swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编.这个在IOS8中是允许的. ...

  3. iOS OC和Swift进行互相调用

    有时候 ,我们会涉及到双向混合编程,特别是OC和swift的互相引用. swift调用oc的方法: 1.桥接文件,一般是swift工程,在创建一个oc文件时,系统自动添加(不用改名,直接默认即可) 2 ...

  4. 【转】IOS --- OC与Swift混编

    群里大神发的网址,感觉有用就先收录了,暂时没时间看SWIFT,感觉代码简洁,但是可阅读性不是太高,有些代码让系统去判断类型,同样的,我们看代码的时候也得自己去判断类型,或许看多就习惯了,有时间再说吧, ...

  5. OC调用Swift 整理步骤!总结别人的!方便自己查找!

    1. 2. 上面的修改了一个配置项,有一个Product Module Name在后面会使用. 在工程里面点击File/New/File…,选择iOS/Source/Cocoa Touch Class ...

  6. OC与Swift混编

    群里大神发的网址,感觉有用就先收录了,暂时没时间看SWIFT,感觉代码简洁,但是可阅读性不是太高,有些代码让系统去判断类型,同样的,我们看代码的时候也得自己去判断类型,或许看多就习惯了,有时间再说吧, ...

  7. 初步swift语言学习笔记9(OC与Swift杂)

    笔者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...

  8. iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包

    本文章将从两个方向分别介绍 OC 与 swift 混编 1. 第一个方向从 swift工程 中引入 oc类 1. 1 如何在swift的类中使用oc类    1.2  如何在swift中实现oc的代理 ...

  9. OC跟Swift混编

    OC项目中使用Swift 本文版权归作者所有,如需转载请联系孟祥月 CSDN博客:http://blog.csdn.net/mengxiangyue  独立博客:http://mengxiangyue ...

随机推荐

  1. Java 泛型 协变性、逆变性

    Java 泛型 协变性.逆变性 @author ixenos 摘要:协变性.协变通配符.协变数组.协变返回值 协变性.逆变性和无关性 在面向对象的计算机程序语言中,经常涉及到类型之间的转换,例如从具体 ...

  2. Talking Ben App砸壳记

    需求: 导出Talking Ben app的头文件 实施: 1)准备材料: 越狱IOS设备一部,并安装Talking Ben游戏 IOS设备上安装open SSH IOS设备的/usr/bin 中安装 ...

  3. Openjudge-计算概论(A)-回文串判断

    描述: 任意给定一个非空的字符串,判断其是否是回文串.回文串是指正向看和反向看均相等的串,如AbcDcbA和cDDc.如果是回文串,则输出1,否则,输出0 输入长度不小于1不大于100的字符串输出如果 ...

  4. erlang程序优化点的总结(持续更新)

    转自:http://wqtn22.iteye.com/blog/1820587 转载请注明出处 注意,这里只是给出一个总结,具体性能需要根据实际环境和需要来确定 霸爷指出,新的erlang虚拟机有很多 ...

  5. Set下面HashSet,TreeSet和LinkedHashSet的区别

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...

  6. JavaScript(10)——Ajax以及跨域处理

    Ajax以及跨域处理 哈哈哈,终于写到最后一章了.不过也还没有结束,说,不要为了学习而学习,恩.我是为了好好学习而学习呀.哈哈哈.正在尝试爱上代码,虽然有一丢丢的难,不过,我相信我会的! [Ajax] ...

  7. HDU - 2586 How far away ?(LCA模板题)

    HDU - 2586 How far away ? Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & ...

  8. 11--Python 备份文件程序

    最近看了下<A Byte of Python>, 看见一个非常有意思的程序,用python进行文件行备份的练习程序, 自己在机器上敲代码运行了一遍,结果出现了一个小问题,路径出错--&qu ...

  9. HDU 5348 MZL's endless loop

    乱搞题...第一直觉是混合图的欧拉通路,但是感觉并没有多大关系.最终AC的做法是不断的寻找欧拉通路,然后给边标号.所有边访问了一遍,所有点访问了一遍,效率是o(n+m).不存在-1的情况. #incl ...

  10. iOS下uiview和uiscrollview设置背景图片的源码

    1.uiscrollview 设置背景图片 // Setup the Scroll ViewUIScrollView*tempScrollView=(UIScrollView*)self.view;t ...