全新构建后找不到myProjectName-Swift.h

时间:2018-10-19 11:53:54

标签: ios objective-c swift bridging-header

花了很多时间在Google和SO上找到解决方案,但没有成功。非常希望有人能指出问题所在。

所以我有 objc + swift项目。我有一个Bridging Header文件,其中有imports个Objc头文件,需要在Swift中使用。

为了解释这个问题,我将分享两种情况。在第一种情况下,一切正常。在第二个中显示了一个错误。

请注意:两种方案具有相同的代码库。

方案1.无效,显示错误。

  1. 我打开项目。
  2. 硬清洁它。
  3. 构建
  4. 显示错误:'myProjectName-Swift.h' file not found
  5. 它也显示这样的错误:
  

无法发出预编译的头文件   '/Users/tungfam/Library/Developer/Xcode/DerivedData/myProjectName-ctxxkwqtckhvyoawavmuzmdxqaml/Build/Intermediates.noindex/PrecompiledHeaders/myProjectName-Bridging-Header-swift_1UP5PCPCLBPHP-clang_18PVOch5108TD8S。   用于桥接头   '/Users/tungfam/Developer/myProjectName/myProjectName/App/myProjectName-Bridging-Header.h'

方案2。如何使其发挥作用。

  1. 我从方案1中提取了相同的代码。
  2. 硬清洁
  3. 注释imports文件中的Bridging Header
  4. 注释我使用Obc文件的Swift代码(在上一步中刚刚注释的桥接头文件中声明)
  5. 我建立了项目。成功了。
  6. 由于应用程序中的某些部分已损坏,因此我发表了评论。我取消了imports文件中的Bridging Header和使用Objc类的Swift代码的注释。
  7. 再次运行(无需彻底清洁),一切正常。

在此问题上的任何帮助将非常感谢。请分享您认为可能有助于解决此问题的任何内容。

我正在使用Xcode 10.0;雨燕4.2

UPDATE1 :我认为它与我在上面放置的第二个错误有关。也许它无法生成该桥接文件。

UPDATE2 :我读到类似的内容:“如果要将名为ABC的Objc文件导入到Bridging Header中,并且如果该ABC将myProjectName-Swift.h文件导入到他自己中。那么这种情况可能会有一些问题,您认为这是真的吗?

2 个答案:

答案 0 :(得分:1)

您不得在头文件中使用#import "ProjectName-Swift.h"

如果在Obj-C代码中需要Swift类或协议,则可以在相关的Obj-C标头中进行声明。以下是more information

  

当Objective-C头文件中的声明引用来自同一目标的Swift类或协议时,导入生成的头会创建一个循环引用。为避免这种情况,请使用Swift类或协议的前向声明在Objective-C接口中对其进行引用。

// MyObjcClass.h
@class MySwiftClass;
@protocol MySwiftProtocol;

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end

另外,请注意,您可能在将Swift枚举以及协议和类导入ObjC时遇到问题,因此您可能需要使用@objc关键字来显式定义想要对ObjC代码可用的项目。

您将无法在Obj-C中使用Swift结构。

答案 1 :(得分:0)

从Swift到Objective C,您只需在需要访问Swift代码的Objective C类上使用#import "ProjectName-Swift.h"。无需添加桥接头文件。对于从Objective C到Swift的另一种选择,则需要在桥接头文件中进行声明。