天天看點

Swift 與 Objective-C混編xxx-Swift.h File not found

在iOS 開發中,由于蘋果14年釋出了Swift語言,具備簡單實用、高效等諸多優點,越來越受開發者青睐。另外,由于Objective-C多年發展和穩定性,有很多架構(特别是商業SDK)采用Objective-C,或者之前的老項目使用Swift語言。都需要涉及到混編,才可以實作檔案互相識别與引用。

Swift中使用Objective-C

重點檔案:橋接檔案

如果建立項目選擇的是Swfit, 如果要使用Objective-C的架構(實際項目中一定會遇到)或者檔案,就需要建立橋接檔案xxx-Bridging-Header.h,然後将Objective-C引入。一般你建立一個.h檔案,Xcode會自定詢問你是否建立橋接檔案。

Swift中需要使用到的Objective-C都需要在橋接檔案中引入。這樣swift調用的時候才可以識别到。

Objective-C中使用Swift

重點檔案:Swfit頭檔案(一下簡稱Swift.h)

建立項目基于Objective-C,如果要使用Swfit檔案,在編譯的時候會自動為Swift檔案生成一個"項目名-Swift.h"的頭檔案,裡面包含了所有Swift檔案的Objective-C方式聲明。

 "XXX-Swift.h"檔案找不到錯誤

在開發中有可能會遇到“xxx-Swift.h File not found”的編譯錯誤,有如下修複方式

1. 項目名引起

檢查項目名是否含有空格或連接配接符,如果有,需要引入的swift.h檔案名字,比如下面的

     My Project   檔案名應該是My_Project-Swfit.h

     My-Project   檔案名應該是My_Project-Swfit.h

如下圖:

Swift 與 Objective-C混編xxx-Swift.h File not found

看到有人說需要将build setting Packaging 下的defines Module 設定為Yes, 我不知道有沒有用,反正我是沒有設定都可以。

2.  循環引起

描述一下我遇到這個問題的情況,我們定義了一個pch檔案用來引入所有需要用到的Objective-C頭檔案,最後一行也引入了Swift.h檔案,(這樣的想法是Objective-C使用Swfit的時候不需要再引入)。 最後我們在橋接檔案中引入pch檔案。最後發生着Swift.h檔案找不到。

在閱讀了這個大哥【Objective-C與Swift混編】的文章後,豁然開朗。

混編編譯順序

當 Objective-C 與 Swift 進行混編時,編譯的過程(Pipeline)是:

  • 首先編譯 Swift Module。預編譯 Bridging Header 後,再編譯 Swift 源檔案。
  • Swift 編譯完成後,生成 ProjectName-Swift.h 的頭檔案供 Objective-C 使用。
  • 最後編譯 Objective-C 源檔案。

繼續閱讀