Swift和Objc混編的相關使用和注意

概述

Swift的設計的初衷就是擺脫ObjC沉重的歷史包袱,畢竟ObjC的歷史太過悠久,相比于很多現代化語言它缺少一些很酷的語法特性,而且ObjC的語法和其他語言相比差別很大。隨著Swift的改進及Swift開源項目劇增,越來越多的Objective-C工程開始使用Swift混編,不管是在基于Swift工程中或者Objective-C工程中,Swift和Objective-C文件都可以無縫結合。本文首先介紹下Swift與Objective-C混編的基本使用。

Objc與Swift的淵源

通過對swift的了解,大家不難發現Swift和ObjC必然存在著一定的映射關系,例如對于文件的操作使用了字符串的writeToFile方法,在網絡請求時使用的NSURLSession,雖然調用方式不同但是其參數完全和做ObjC開發時調用方式一致。原因就是Swift編譯器自動做了映射,如下圖:(PS:借來的圖)
這里寫圖片描述

Objc和Swift的相互調用

切入正題,當我們使用OC和Swift在工程中進行混編的時候,通俗來說其實Objc文件和swift文件之間的相互調用。不管你的項目是基于Swift還是基于Objc的,無論是Swift中調用ObjC,還是ObjC中調用Swift都是通過頭文件暴漏對應接口的,下圖說明了這種交互方式:
OC與Swift調用方式

**Swift調用Objc **


下面我們先建個Objc的工程,在Objc工程中新建Swift文件時,(或者在Swift工程新建Objc文件),Xcode會自動提示你是否創建bridging header橋接頭文件,點擊創建后Xcode會自動為你創建一個橋接頭文件。Xcode會自動創建一個名為OC_Swift-Bridging-Header.h橋接頭文件如圖下圖:

Xcode自動為你創建一個橋接頭文件
自動生成的OC_Swift-Bridging-Header.h橋接頭文件
當然你也可以在Building Settings中自己設置橋接頭文件,如下圖:
手動設置
創建好OC_Swift-Bridging-Header.h文件后,在OC_Swift-Bridging-Header.h文件中即可import需要提供給Swift的Objective-C頭文件,Swift即可調用對應的Objective-C文件。同時Xcode可以自動生成Objective-C對應的Swift接口。
( 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中有效的接口。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容