myProjectName-Swift.h 清理构建后未找到
myProjectName-Swift.h not found after clean build
花了很多时间在 google 和 SO 上寻找解决方案,但没有成功。非常希望有人能指出可能是什么问题。
所以我有 objc+swift 项目。我有一个 Bridging Header
文件,其中包含我需要在 Swift.
中使用的 imports
个 Objc header 文件
为了解释这个问题,我将分享 2 个场景。在第一种情况下,一切正常。在 2nd 中显示错误。
请注意:两种方案具有相同的代码库。
场景 1。不起作用,显示错误。
- 我打开项目。
- 彻底清洁它。
- 建造
- 显示错误:
'myProjectName-Swift.h' file not found
- 它也显示这样的错误:
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 中的相同代码。
- 彻底清洁它
- 在
Bridging Header
文件中注释 imports
- 评论我使用 Obc 文件的 Swift 代码(在桥接 header 中声明,我刚刚在上一步评论)
- 我构建项目。它成功了。
- 由于应用程序中的某些部分已损坏,因为我评论了一些东西。我取消注释
Bridging Header
文件中的 imports
和我使用 Objc 类. 的 Swift 代码
- 运行 再次(没有硬清洁)一切正常。
非常感谢在此问题上的任何帮助。请分享您认为可能有助于解决此问题的任何内容。
我正在使用 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 结构。
花了很多时间在 google 和 SO 上寻找解决方案,但没有成功。非常希望有人能指出可能是什么问题。
所以我有 objc+swift 项目。我有一个 Bridging Header
文件,其中包含我需要在 Swift.
imports
个 Objc header 文件
为了解释这个问题,我将分享 2 个场景。在第一种情况下,一切正常。在 2nd 中显示错误。
请注意:两种方案具有相同的代码库。
场景 1。不起作用,显示错误。
- 我打开项目。
- 彻底清洁它。
- 建造
- 显示错误:
'myProjectName-Swift.h' file not found
- 它也显示这样的错误:
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 中的相同代码。
- 彻底清洁它
- 在
Bridging Header
文件中注释imports
- 评论我使用 Obc 文件的 Swift 代码(在桥接 header 中声明,我刚刚在上一步评论)
- 我构建项目。它成功了。
- 由于应用程序中的某些部分已损坏,因为我评论了一些东西。我取消注释
Bridging Header
文件中的imports
和我使用 Objc 类. 的 Swift 代码
- 运行 再次(没有硬清洁)一切正常。
非常感谢在此问题上的任何帮助。请分享您认为可能有助于解决此问题的任何内容。
我正在使用 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 结构。