XCode在某些文件中找不到Swift桥接头文件

问题描述:

我在使用XCode的iOs应用程序中遇到问题。它已被Objective-C编码,现在我正在一个接一个地在Swift中迁移文件。代码由团队成员与版本控制系统(git)共享。XCode在某些文件中找不到Swift桥接头文件

我开始与核心类和我继续像这样:

  • 我写在斯威夫特文件中的新类,恩。 MyClass.swift(与@objc前缀关键词)
  • 我通过@class MyClass;在头文件替换#import "MyClass.h"
  • 我添加在实现文件#import "MyProject-Swift.h"(.M)需要它
  • 我删除MyClass.h和MyClass.m文件
  • 我清理并生成项目

这个过程已经工作了好几次,但由于某些原因,一些#import "MyProject-Swift.h"不工作,我也得到了错误:“MyProject的-Swift.h”文件N没有发现

根据导致问题的不同文件,有时Ctrl + Click会打开“MyProject-Swift.h”文件,有时不会(不管“未找到错误”)。

但该文件存在,并且翻译的Swift代码存在于其中。

另一件奇怪的事情是,我试图从使用#import "MyProject-Swift.h"的东西中重新创建新的.h和.m文件,然后出现问题,之后它就能正常工作(有时候不会出现其他错误)!

因为它在某些情况下工作,我真的不明白为什么它会导致其他情况下的问题。当然,我在数十个主题中进行了搜索,但没有发现有同样问题的任何人。

它可能是XCode设置问题,还是因为团队开发人员之间的XCode版本不同?

有什么想法?

感谢

编辑:

我完成与另一个角度来看这个问题的描述。

我的项目处于工作状态:使用一些新的Swift文件,它构建并运行良好(一些Objective-C文件使用Swift文件)。

我知道有问题一定.m文件:

  • 我在开头加#import "MyProject-Swift.h",没有别的
  • 的XCode说'MyProject的-Swift.h' 找不到文件,按Ctrl +点击不起作用,并且项目不会生成
  • 但是,如果我点击带有四个小方块(编辑器左上角)的按钮,在显示的菜单中我有“包含”,“MyProject-Swift 。H”是其下上市,并点击‘MyProject的-Swift.h’打开文件

更换#import "MyProject-Swift.h"通过#import <MyProject-Swift.h>不会改变任何东西

我也有这种情况,有时!。按Ctrl +点击打开 “MyProject的-Swift.h”,但说的XCode 'MyProject的-Swift.h' 找不到文件(它不会建为好)。

我终于想出了自己的解决方案:project.pbxproj文件在某些​​git合并后发生了一些破坏,我猜想。项目中的一些文件在该文件中被引用了两次,所以我删除了那些我认为不好的文件(也许随机选择的更接近实际)。

现在它的工作就像一个魅力。

事实上,这对我的项目没有影响,直到我试图将文件迁移到Swift!

在XCode中使用工具或函数将project.pbxproj文件重置为当前我们所拥有的东西将是一个好主意。

+1

我发现这个:https://github.com/truebit/xUnique,但我不能让它按预期工作 –

+1

我发现这一个,运作良好:https://github.com/simonwagner/mergepbx,给它一个pbxproj文件有冲突,它会修复它(它扫描你的项目源文件)。 –

  1. 添加一个头文件到您的项目,名为[MyProjectName] - Bridge-Header.h。这将是单个头文件,您可以导入希望Swift代码访问的任何Objective-C代码。

  2. 在您的项目构建设置中,找到Swift Compiler - Code Generation,然后在Objective-C Bridging Header旁边添加从项目的根文件夹到桥接头文件的路径。所以它可以通过MyProject/MyProject-Bridging-Header.h或简单地MyProject-Bridging-Header.h如果文件居住在项目根文件夹。

您只需要一个桥接接头。将#import语句添加到此文件中,并且您的类现在可以在您的Swift代码中使用,而无需任何额外的导入语句。

+0

感谢您的快速回复。你提到的文件已经被创建和设置。这里的目的是做相反的事情:在Objective-C中使用Swift代码。所以这不是MyProject-Bridging-Header.h,而是MyProject-Swift.h引起的问题。 –

+0

我编辑了描述以添加一些细节。 –

基础上that asumption https://*.com/a/31540611/2150954我在这个简单的方式

查找目标的C文件解决了这个问题,在编译器声称,它不能找到YourProject - 斯威夫特文件存在。 删除它从项目文件,然后添加

之后,我的项目成功编译和运行

+1

这样做的效果是删除project.pbxproj中的所有文件引用(通过删除obj-c文件),然后重新创建它们(通过重新创建obj-c文件)。所以是的,如果您的文件受到影响很少,这可以是一个解决方案。 –

如果你有两个目标,你不断收到编译在ObjC代码中使用新编辑的快捷文件/语义错误,这可能是问题 -

你有两个<ProjectName>-swift.h文件。像在mycase中: MyProject-swift.hMyProjectSandbox-swift.h 这些是具有所有swift类和方法的文件。 (这些打开当你命令点击从Obj-C代码中的任何Swift类)

因此,我正在致力于Sandbox目标。 我发现,当我对swift文件和clean-build进行更改时,只更新了MyProjectSandbox-swift.h。 但主要的问题是ObjC代码指的是MyProject-swift.h文件,我只是重建(沙盒)目标我工作不更新..

TL; DR;

因此,解决办法是,以确保清理并重建BOTH你的目标,使两者(MyProject-swift.hMyProjectSandbox-swift.h)与最新的SWIFT代码和类更新。

这将更新这两个文件,并且您的ObjC代码不会为swift文件显示任何不相关的编译错误。