OC與Swift混編之橋接文件

  • 環境介紹:

    mac OS sierra 10.12.6
    Xcode9(Version 9.0 (9A235))
    OC的項目,項目中包含多個Target,用於實現環境分離。

    目標:用Swift4.0版本版本進行普通混編開發(此外還有開發Framework混編、引用外部Framework和宿主App混編)。

    普通混編說明

    Swift訪問OC OC訪問Swift
    不需要在Swift中import OC的類,統一在橋接文件(ProductName-Bridging-Header.h)中導入需要暴露給Swift的OC類即可在Swift中訪問。 在OC類中導入ProductName-Swift.h文件(根據不同Target的名稱,對應文件名稱不同),即可訪問Swift中暴露給OC的屬性和方法。

    項目大體結構如如下圖:

    項目概覽.png

    一、Swift中如何訪問OC的類

    當我們第一次在工程中創建一個.Swift文件,Xcode會提示你是否創建橋接文件,點擊‘是’,Xcode會幫我們給每一個Target建立對應的橋接文件(用於在Swift中訪問OC的類)。如果點擊了‘否’,可以自己創建橋接文件,然後在下圖位置指定橋接文件路徑(注意每個Target都對應配置好)

    設置橋接路徑.png

    由於不同Target下的橋接文件名稱不一樣,如果你覺得Swift需要訪問OC下的類每個環境不需區分(我們工程中不需要),那麼把各個Target下的橋接路徑改成同一個即可,刪除其他的橋接文件(以後若需區分可以再添加)省得需要同時往多個環境下導入OC的類

    設置橋接路徑.png

     

    Xcode9默認混編下的Swift版本不是4.0,各個Target都配置一下

    設置Swift版本號.png

    在橋接文件中導入Swift需要訪問的OC類,.Swift文件中即訪問OC的類了

    暴露給Swift的文件列表.png

    p7.png

    二、OC中如何訪問Swift的類(Swift4.0中想要暴露給OC的方法和屬性前面都需添加@objc)

    首先,給每個Target下的build Settings的Defines Module設置爲YES

    設置Defines Module.png

    由於Xcode會根據不同的Target的創建不同的‘Swift轉換OC下生的成接口頭文件’,英文:Objective-C Generated interface Header Name,如下圖

    Swift轉OC接口文件.png

    Swift轉OC接口文件.png

    OC想要訪問Swift的文件,需要根據不同Target下導入不同的接口文件,因此我們定義一個Swift.h文件,根據不同的Target導入不同的轉接口文件即可。如下圖:

    Swift轉OC接口文件統一管理.png

    如果你沒有在某個OC類中引入當前Target下的接口文件和編譯,貌似是沒有辦法通過command+點擊跳入進去。所以我們只需要在某個OC文件中導入該接口文件然後編譯,就可以跳入進去了,這裏爲了方便,建立一個Swift.h文件,根據環境import不同的接口文件。

    上面的預編譯宏在下圖配置(不同Target配置不同的預編譯宏,實現環境分離)

    OC預編譯宏.png

    Swift下因爲沒有預編譯宏,但是可以通過Swift Flags配置實現條件編譯達到同樣的效果(每添加一個標識前,都需要添加一個 -D ,Debug和Release模式下都需要添加-D ,不然編譯器無法識別) :

    Swift編譯變量.png

     

    至此,配置完成。

    Tip:

    1、Swift 3.2暴露給OC的屬性和方法不需要添加@objc,但是4.0需要。
    2、如果你使用的Xcode9.0以下的版本,那麼到你導入ProductName-Swift.h文件的時候可能報錯,告訴你對應的接口文件(ProductName-Swift.h not found)找不到,但是你的各項配置都正確,應該是Xcode的編譯器問題(Clean、重啓都沒用),直接run就好了,應該能run起來,雖然編譯器一直提示報錯,建議升級Xcode。
    3、直接拖動對應的Swift文件到工程的話,好像直接拖動添加.swift文件到工程Xcode不會添加到編譯列表中,因此要注意檢查拖動的文件是否添加到了build phase的編譯列表中。
    4、OC項目混編Swift的時候,如果項目沒有自動生成橋接文件(ProductName-Bridging-Header.h),那麼你一定要自己創建並配置好路徑。
    因爲:沒有橋接文件會影響到你的Swift轉OC接口文件(ProductName-Swift.h)中Swift要暴露給OC生成的接口。具體影響有:假設你拖動了N個Swift類,雖然要暴露給OC的Swift基本類和方法都添加了@objc,但只有extention類會自動生成對應的轉接口,其他類不會。

     



    作者:002and001
    鏈接:https://www.jianshu.com/p/754396e7e1bd
    來源:簡書
    簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章