入职新公司后,接手了一个Swift项目。项目质量已经吐槽过一次就略过了,感兴趣的能够看我以前的博客。固然我以前对Swift只是略有了解,略到只看过没写过的程度,主要语言仍是OC。不过嘛其实语言都是相通的,况且方法都是相同的只不过语法上可能有点儿小差错。不过仍然有些东西会莫名其妙被卡住。框架
好比建立一个UIButton,OC中咱们通常使用 [UIButton buttonWithType:UIButtonType] 这个构造方法来快速初始化并赋予UIButton的type属性,固然也有一个缘由是UIButton的type是read-only属性,咱们只能在初始化方法中去设置它。那么Swift中怎么写呢?ui
答案是 UIButton.init(type: UIButtonType) 。有没有感受常见的方法参数变的很别扭?不过慢慢的就习惯啦。其他的好比“中括号+空格”的调方法语法改成所有“.”出来,语句结束若换行则不用加";"等等等等吧。不过本篇并非Swift与OC的开发过程当中的语法比较,而是二者怎么桥接,因此切回正题啦。spa
1.Swift中调用OC的类与方法blog
在正式开始接手项目以后,须要添加UITableView的下拉刷新、上拉加载和等待窗口HUD的功能。几乎全部的项目中都涉及到这样的功能,对咱们来讲实在是太简单了。使用系统控件UIRefreshControl本身手写当然麻烦,但咱们有极其方便李明杰的MJRefresh三方框架来一句话添加下拉刷新与上拉加载(非广告,我也不是跟李明杰学的,不过这个刷新控件确实不错,节省时间)。至于HUD,咱们同样扔掉了UIProgressView控件来使用MBProgressHUD三方框架添加等待HUD。这简直没有难度嘛。教程
等一下,好像少了点儿什么。开发
咱们是用Swift开发的工程啊,而上述两个三方框架与许许多多成熟的三方框架,几乎都是使用的Objective-C封装的。支持Swift这种不断更新的语言的三方框架不多。get
摆在面前两条路,本身使用系统控件封装,或者研究下Swift类中怎么调用Objective-C的类。编译器
尝试了下使用UIRefreshControl来封装下拉加载。作确实是作出来了,不过 1.样子很丑;2.刷新不敏感;3.须要等待HUD还须要本身封装。虽然能够实现可是对于强迫症来讲,习惯了MJRefresh的快捷高效再来使用这个,简直难受的不要不要的。博客
终于到主题了,桥接。it
咱们知道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类吧~