找不到项目-Swift.h文件

lnxxn5zx  于 2023-05-27  发布在  Swift
关注(0)|答案(5)|浏览(321)

我有一个新的Swift项目,有几个文件,我需要添加一些Objc代码。
Build Settings中,我的Objective-C Generated Interface Header NameMyProject-Swift.h
Product Module NameProduct Name都是MyProject。
我的Objective-C Bridging HeaderMyProject/MyProject-Bridging-Header.h
我的Bridging Header的内容是:

#ifndef MyProject_Bridging_Header_h
#define MyProject_Bridging_Header_h

#import "Blakey.h"

#endif

Blakey.h非常简单:

@import Foundation;

#import "MyProject-Swift.h"
@class KeyPair;

@interface Blakey: NSObject

- (void)createKeyPairForSeed:(NSString *)seed;

@end

Blakey.m

#import <Foundation/Foundation.h>
#import "Blakey.h"

@implementation Blakey

- (void)createKeyPairForSeed:(NSString *)seed;
{

}

@end

(side注意:我知道我的函数返回一个void,一旦这个问题被修复,它将在稍后被更改,因此它返回一个实际值)
为什么Xcode在Blakey.h中的#import "MyProject-Swift.h"上抛出错误?

x6492ojm

x6492ojm1#

Project-Swift.h是Xcode在成功编译项目时自动生成的文件。这里的关键词是编译成功如果你的项目有任何编译错误Project-Swift.h文件将不会生成。从某种意义上说,这是一个僵局。Bestway注解掉所有有编译错误的行,然后设法让它编译没有任何错误。只有在此之后,才会生成Project-Swift.h
附加信息,一旦Project-Swift.h文件生成,如果你打开它,如果你碰巧看到你的Swift类没有导入那里,那是因为Project-Swift.h只导入从NSObject扩展的类,所以普通的Swift类不会被导入。

问题:

您需要在.m文件中导入Project-Swift.h,而不是.h文件。所以修改你的Blakey为

#import <Foundation/Foundation.h>
#import "Blakey.h"
#import "MyProject-Swift.h"

@implementation Blakey

- (void)createKeyPairForSeed:(NSString *)seed;
{

}

最后从Blakey.h删除#import "MyProject-Swift.h"

@import Foundation;

@class KeyPair;

@interface Blakey: NSObject

- (void)createKeyPairForSeed:(NSString *)seed;

@end
a9wyjsp7

a9wyjsp72#

我有类似的问题,几乎花了一整天的时间试图找出我的应用程序有什么问题。下面是帮助我的解决方案:
1.清除派生数据
1.在swift中创建一个前缀为@objc的类,例如@objc class mySwiftClass{...}
1.重新生成项目
好了...现在应该可以了。

**为什么要添加@objc?**这个@objc前缀,告诉编译器为你的swift类生成一个头文件。它会将其添加到“MyModule-Swift.h”文件中

vu8f3i0k

vu8f3i0k3#

我意识到这是一个旧的线程,但我在向项目添加新目标后遇到了类似的问题。我通过只在目标中添加预处理器宏(Build Settings -> Apple Clang - Preprocessing),然后有条件地导入Swift.h文件来解决这个问题,如下所示:

#if DEV_VERSION
#import "Project_DEV-Swift.h"
#else
#import "Project-Swift.h"
#endif

我的主目标名为Project,新目标名为Project DEV(导入中的空格替换为下划线),预处理器宏名为DEV_VERSION
这样做之后,两个目标都建立得很好。

jxct1oxe

jxct1oxe4#

我有一个类似的问题,即它会有这个问题的任何其他生活。我通过将“产品模块名称”和“产品名称”硬编码到我的项目名称来解决这个问题。这就避免了在每个包含swift代码的文件中使用预处理器逻辑的需要,正如Pauli Kettunen的解决方案中所演示的那样。

ryoqjall

ryoqjall5#

Xcode编译时错误

<product_name>-Swift.h file not found

它是Swift和Objective-C之间的桥梁(适配器)。此文件包含Swift的Objective-C API,标记为@objc and @objcMembers(https://stackoverflow.com/a/59217057/4770877)。
你可以通过导入一个Xcode-generated header file,在项目中的Objective-C代码中使用Swift中声明的类型。
头文件的名称由<product_name>-Swift.h生成
Mixing Objective-C and Swift (https://stackoverflow.com/a/59217109/4770877)

相关问题