按照文檔壹步壹步來
新建壹個基於單頁面工程,然後新建壹個壹個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的類被隱藏了。