當前位置:成語大全網 - 新華字典 - ios OC、swift混編制作framework

ios OC、swift混編制作framework

按照文檔壹步壹步來

新建壹個基於單頁面工程,然後新建壹個壹個Target,選中Cocoa Touch Framework。然後,分別新建壹個Swift文件和Objective C類,註意Target Member Ship選中Framework。類的內容如下:

OCSource.h

[圖片上傳失敗...(image-8dab68-1634619754604)]

OCSource.m

[圖片上傳失敗...(image-2c9071-1634619754604)]

Swift調用OC

新建SwiftSource.swift

[圖片上傳失敗...(image-34eca8-1634619754604)]

然後,按照文檔中,為了讓Swift文件訪問Objective C文件,我們應該在umbrella header,也就是MixFramework.h中,暴露所需要的header。

也就是,MixFramework.h,

[圖片上傳失敗...(image-b166c3-1634619754604)]

然後,自信滿滿的點擊build。

Boom~~~,編譯不通過。

[圖片上傳失敗...(image-6ca763-1634619754604)]

原因:OCSource.h默認編譯的時候是Project權限. 為了在umbrella header中使用,要把這個文件的權限改成Public

按照圖中的方式拖過去即可。

[圖片上傳失敗...(image-f2d31d-1634619754604)]

嗯,現在build,可以看到build成功了。

OC調用Swift

在SwiftSource.swift中,增加壹個類,

[圖片上傳失敗...(image-98ce8c-1634619754604)]

然後,為了在OC中調用Swift的方法,我們需要導入頭文件,這時候,OCSource.m文件內容如下

[圖片上傳失敗...(image-f61fb3-1634619754604)]

然後,build,發現成功了,很開心。

外部調用

在ViewController.swift中,我們調用Framework中的內容。

[圖片上傳失敗...(image-6be19c-1634619754604)]

然後運行,發現控制臺打印出

[圖片上傳失敗...(image-4b70-1634619754604)]

嗯,framework打包成功了。

問題

通常,我們希望暴露給外部的接口是純Swift,而OC文件的具體接口應該隱藏,這就是我標題中的優雅兩個字的含義。

如果妳好奇,妳會發現,在ViewController.swift中妳可以這麽調用

[圖片上傳失敗...(image-fefccf-1634619754604)]

也就是說,OC的內容也暴露出來了,這破壞了Framework的封裝特性。

通過查看MixFramework的編譯結果,發現最後暴露出的接口是這樣子的

[圖片上傳失敗...(image-8b0488-1634619754604)]

這壹行,把OC對應的實現暴露出來了

[圖片上傳失敗...(image-9c74a7-1634619754604)]

優雅的解決方案

不再通過umbrella header的方式讓framework中的Swift調用OC方法。而是通過modulemap。

新建壹個module.modulemap文件,內容如下

[圖片上傳失敗...(image-633a91-1634619754604)]

[圖片上傳失敗...(image-d30f90-1634619754604)]

這裏的#(SRCROOT)是XCode的宏,會自動替換成項目所在的根目錄,這裏輸入的路徑是module.modulemap文件所在的路徑。

然後,刪除MixFramework.h(umbrella header)中#import 的OC header。

把OCSource.h的權限改回默認的project。

[圖片上傳失敗...(image-291cca-1634619754604)]

再編譯,發現OC的類被隱藏了。