概述
Swift的設計的初衷就是擺脫ObjC沉重的歷史包袱,畢竟ObjC的歷史太過悠久,相比于很多現代化語言它缺少一些很酷的語法特性,而且ObjC的語法和其他語言相比差別很大。隨著Swift的改進及Swift開源項目劇增,越來越多的Objective-C工程開始使用Swift混編,不管是在基于Swift工程中或者Objective-C工程中,Swift和Objective-C文件都可以無縫結合。本文首先介紹下Swift與Objective-C混編的基本使用。
通過對swift的了解,大家不難發現Swift和ObjC必然存在著一定的映射關系,例如對于文件的操作使用了字符串的writeToFile方法,在網絡請求時使用的NSURLSession,雖然調用方式不同但是其參數完全和做ObjC開發時調用方式一致。原因就是Swift編譯器自動做了映射,如下圖:(PS:借來的圖)Objc與Swift的淵源
切入正題,當我們使用OC和Swift在工程中進行混編的時候,通俗來說其實Objc文件和swift文件之間的相互調用。不管你的項目是基于Swift還是基于Objc的,無論是Swift中調用ObjC,還是ObjC中調用Swift都是通過頭文件暴漏對應接口的,下圖說明了這種交互方式:Objc和Swift的相互調用
**Swift調用Objc **
下面我們先建個Objc的工程,在Objc工程中新建Swift文件時,(或者在Swift工程新建Objc文件),Xcode會自動提示你是否創建bridging header橋接頭文件,點擊創建后Xcode會自動為你創建一個橋接頭文件。Xcode會自動創建一個名為OC_Swift-Bridging-Header.h橋接頭文件如圖下圖:
( PS:Objective-C類、協議、屬性、方法、擴展、閉包等所有功能都可以無縫地被轉換為Swift接口被Swift文件所調用。)
**Objc調用Swift **
Xcode會自動為Project生成頭文件以便在Objective-C中調用。在Objective-C類中調用Swift,只需要#import "productModuleName-Swift.h"即可調用,Xcode提供的頭文件以Swift代碼的模塊名加上-Swift.h為命名。
(PS:我這有個通俗的理解方式,不喜勿噴,可能不專業,但是好理解。。 "productModuleName-Swift.h文件可以理解為:這個是Objective-C調用Swift的,你寫的swift文件在這個文件里對外提供了OC使用的接口,OC調swift,引入這個文件,相當于直接可以使用對外接口了,你可以通俗理解 平常OC的.h文件留的接口)
在這個頭文件中,將包含Swift提供給Objective-C的所有接口、Appdelegate及自動生成的一些宏定義。在大部分情況下,Objective-C都可以無縫地調用Swift,但是由于Swift相對于Objective-C多了一些新特性,比如泛型、元組、枚舉的等,所以Swift暴漏給Objective-C的接口多了一些限制,因此Swift只能暴露在Objective-C中有效的接口。