myProjectName-Swift.h 清理构建后未找到

myProjectName-Swift.h not found after clean build

花了很多时间在 google 和 SO 上寻找解决方案,但没有成功。非常希望有人能指出可能是什么问题。

所以我有 objc+swift 项目。我有一个 Bridging Header 文件,其中包含我需要在 Swift.

中使用的 imports 个 Objc header 文件

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

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

场景 1。不起作用,显示错误。

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

failed to emit precompiled header '/Users/tungfam/Library/Developer/Xcode/DerivedData/myProjectName-ctxxkwqtckhvyoawavmuzmdxqaml/Build/Intermediates.noindex/PrecompiledHeaders/myProjectName-Bridging-Header-swift_1UP5PCPCLBPHP-clang_18PVO5108TD8S.pch' for bridging header '/Users/tungfam/Developer/myProjectName/myProjectName/App/myProjectName-Bridging-Header.h'

场景 2. 如何让它工作。

  1. 我使用场景 1 中的相同代码。
  2. 彻底清洁它
  3. Bridging Header 文件中注释 imports
  4. 评论我使用 Obc 文件的 Swift 代码(在桥接 header 中声明,我刚刚在上一步评论)
  5. 我构建项目。它成功了。
  6. 由于应用程序中的某些部分已损坏,因为我评论了一些东西。我取消注释 Bridging Header 文件中的 imports 和我使用 Objc 类.
  7. 的 Swift 代码
  8. 运行 再次(没有硬清洁)一切正常。

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

我正在使用 Xcode 10.0; Swift4.2

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

UPDATE2:我读到类似这样的内容:“如果您将名为 ABC 的 Objc 文件导入桥接 Header。如果此 ABC 导入himself the file myProjectName-Swift.h. 那么这个case可能会有些问题,你觉得可以吗?

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

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

如果您需要Swift 类或Obj-C代码中的协议,您可以在相关的Obj-C header中转发声明它们。这是 more information 的相关内容:

When declarations in an Objective-C header file refer to a Swift class or protocol that comes from the same target, importing the generated header creates a cyclical reference. To avoid this, use a forward declaration of the Swift class or protocol to reference it in an Objective-C interface.

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

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

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

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