[英]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.