[英]Xcode does not find Swift bridging header file in some files
我的iOs申請Xcode確實有問題,已經在Objective-C編碼了,現在正在Swift的文件遷移,一個接一個。 代碼通過版本控制系統 (git) 在團隊成員之間共享。
我從核心課程開始,然后這樣進行:
@objc
前綴關鍵字)#import "MyClass.h"
替換為@class MyClass;
在 header 個文件中#import "MyProject-Swift.h"
這個過程已經工作了好幾次,但由於某些原因,一些#import "MyProject-Swift.h"
不起作用,我得到錯誤: 'MyProject-Swift.h' file not found 。
根據導致問題的不同文件,有時,Ctrl+Click 會打開“MyProject-Swift.h”文件,有時則不會(無論“未找到錯誤”)。
但是該文件存在,並且其中存在翻譯后的 Swift 代碼。
另一件事真的很奇怪,我嘗試從那些使用#import "MyProject-Swift.h"
的東西重新創建 new.h 和 .m 文件並遇到問題,然后它工作(有時不工作,我得到其他錯誤)!
由於它在某些情況下有效,我真的不明白為什么它會導致其他情況出現問題。 當然,我搜索了幾十個主題,但沒有找到有同樣問題的人。
可能是 Xcode 設置問題,還是因為團隊開發人員之間的 Xcode 版本不同?
任何的想法?
謝謝
編輯:
我用另一種觀點來完成問題描述。
我確實有一個工作中的項目 state:使用我的一些新的 Swift 文件,它構建和運行良好(一些 Objective-C 文件使用 Swift 文件)。
我知道某個 .m 文件有問題:
#import "MyProject-Swift.h"
,沒有別的 將#import "MyProject-Swift.h"
替換為#import <MyProject-Swift.h>
不會改變任何東西。
我有時也會遇到這種情況:Ctrl+Click 打開“MyProject-Swift.h”,但是 Xcode 說找不到“MyProject-Swift.h”文件(它也不會構建)。
向您的項目添加一個名為[MyProjectName]-Bridging-Header.h的頭文件。 這將是單個頭文件,您可以在其中導入您希望 Swift 代碼訪問的任何 Objective-C 代碼。
在您的項目構建設置中,找到 Swift Compiler – Code Generation,然后在 Objective-C Bridging Header 旁邊從項目的根文件夾中添加到您的橋接頭文件的路徑。 因此,如果文件位於項目根文件夾中,它可以通過MyProject/MyProject-Bridging-Header.h或簡單地MyProject-Bridging-Header.h 。
您只需要一個橋接頭。 將您的 #import 語句添加到此文件中,您的類現在可以在您的 Swift 代碼中使用,而無需任何額外的導入語句。
我終於想出了自己的解決方案:我猜在一些 git merge 之后,project.pbxproj 文件有點損壞。 該項目的某些文件在該文件中被引用了兩次,所以我刪除了我認為不好的那些(可能隨機選擇的更接近事實)。
現在它就像一個魅力。
事實上,在我嘗試將文件遷移到 Swift 之前,這對項目沒有影響!
在 XCode 中有一個工具或函數來將此 project.pbxproj 文件重置為我們擁有的當前內容將是一個好主意。
基於該假設https://stackoverflow.com/a/31540611/2150954我以這種簡單的方式解決了這個問題
找到目標 C 文件,編譯器聲稱在該文件中找不到 YourProject-Swift 文件。 從項目中刪除它的文件,然后添加.
之后我的項目成功編譯並運行
如果您有兩個目標,並且在 ObjC 代碼中使用的新編輯的 swift 文件不斷出現編譯/語義錯誤,這可能是問題所在 -
你有兩個<ProjectName>-swift.h
文件。 就像在 mycase 中: MyProject-swift.h
和MyProjectSandbox-swift.h
這些是包含所有 swift 類和方法的文件。 (當您在 Obj-C 代碼中用 Command 鍵單擊任何 swift 類時,這些會打開) 。
所以我正在研究Sandbox
目標。 我發現,當我對 swift 文件和 clean-build 進行更改時,只有MyProjectSandbox-swift.h
被更新。 但主要問題是 ObjC 代碼指的是MyProject-swift.h
文件,該文件不會更新,因為我只是在重建我正在處理的(沙箱)目標。
TL; 博士;
因此,解決方案是確保您清理並重建兩個目標,以便使用最新的 swift 代碼和類更新兩者( MyProject-swift.h
和MyProjectSandbox-swift.h
)。
這將更新兩個文件,並且您的 ObjC 代碼不會顯示任何與 swift 文件無關的編譯錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.