我有一个带有几个文件的新Swift项目,我需要添加一些Objc代码。
在Build Settings
中,我的Objective-C Generated Interface Header Name
为MyProject-Swift.h
Product Module Name
和Product Name
都是MyProject。
我的Objective-C Bridging Header
是MyProject/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
(旁注:我知道我的函数返回一个空格,一旦修复此问题就会稍后更改,因此它会返回一个实际值)
为什么Xcode会在#import "MyProject-Swift.h"
的{{1}}中抛出错误?
答案 0 :(得分:8)
Project-Swift.h
是Xcode在成功编译项目时自动生成的文件。这里抓住的是成功编译这个词如果您的项目有任何编译错误Project-Swift.h
文件将不会生成。所以在某种程度上它变成了僵局。 Bestway注释掉所有有编译错误的行,然后设法让它编译没有任何错误。只有在Project-Swift.h
之后才会生成。
其他信息,一旦生成Project-Swift.h
文件,如果你打开它,并且你碰巧看到你的swift类没有被导入,因为Project-Swift.h
只导入了从 NSObject 因此不会导入普通的Swift类。
<强> ISSUE:强>
您需要在.m文件中导入Project-Swift.h
而不是.h文件。所以将你的Blakey修改为
#import <Foundation/Foundation.h>
#import "Blakey.h"
#import "MyProject-Swift.h"
@implementation Blakey
- (void)createKeyPairForSeed:(NSString *)seed;
{
}
最后从#import "MyProject-Swift.h"
Blakey.h
@import Foundation;
@class KeyPair;
@interface Blakey: NSObject
- (void)createKeyPairForSeed:(NSString *)seed;
@end
答案 1 :(得分:0)
我有类似的问题,几乎最终花了一整天试图找出我的应用程序有什么问题。 所以按照解决方案帮助我:
Et瞧..现在应该工作了。
为什么要添加@objc? 这个@objc前缀,告诉编译器为你的swift类生成一个头文件。它会将它添加到&#34; MyModule-Swift.h&#34;文件
答案 2 :(得分:0)
您可以通过导入Xcode-generated header file
在项目的Objective-C代码中使用Swift中声明的类型。
标题的名称是通过产品模块名称+ -Swift.h
(<product_name>-Swift.h
)生成的。
此文件包含用于Objective-C的Swift API,其中标记为[@objc and @objcMembers]。因此,Objective-C可以使用Swift
答案 3 :(得分:0)
我意识到这是一个旧线程,但是在向项目添加新目标后我遇到了类似的问题。我通过仅在所述目标中添加预处理器宏(构建设置 -> Apple Clang - 预处理)然后有条件地导入 Swift.h
文件来解决它,如下所示:
#if DEV_VERSION
#import "Project_DEV-Swift.h"
#else
#import "Project-Swift.h"
#endif
我的主要目标名为 Project
,新目标为 Project DEV
(导入中的空格替换为下划线),预处理器宏名为 DEV_VERSION
。>
执行此操作后,两个目标都可以正常构建。