0

我正在创建必须使用 Objective-C 类的 Swift 框架。所以我通过了这个链接。这是我的框架的公共标头:

#import <UIKit/UIKit.h>

//! Project version number for Test.
FOUNDATION_EXPORT double TestVersionNumber;

//! Project version string for Test.
FOUNDATION_EXPORT const unsigned char TestVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <Test/PublicHeader.h>

#import <arpa/inet.h>
#import <ifaddrs.h>
#import <netdb.h>
#import <sys/socket.h>
#import <MyTest/MPAppDelegateProxy.h>  

现在在MPAppDelegateProxy类中,我必须使用Swift我创建的类。这是 :

#import "MPAppDelegateProxy.h"
#import "MyTest.h"

@implementation MPAppDelegateProxy

+ (void)proxyAppDelegate {
    [MPGlobal MPLog:@"App delegate not set, unable to perform automatic setup." file:@"MPAppDelegateProxy.m" function:@"proxyAppDelegate" line:32];
// rest of code
}  

MPGlobal是我的Swift班级之一。但我得到:

使用未声明的标识符“MPGlobal”

注意:我在MPGlobal@objC之前添加了。

4

2 回答 2

0

更改SWIFT_OBJC_INTERFACE_HEADER_NAME构建设置并使其在不同目标中相同。为此,将生成此属性的指令从$(SWIFT_MODULE_NAME)-Swift.h 更改为 $(PROJECT_NAME)-Swift.h 如下所述

通过按 Alt 并进入产品菜单完成此清理构建文件夹后。由于标头的名称在目标之间共享,现在它可以在 .m ObjectiveC 文件中导入一次,并且所有目标都可以从 Swift 类中受益。

如果在构建后仍然显示错误,请确保可以通过 Cmd 单击其名称从 XCode 访问标题。它应该打开一个包含类似以下代码的文件:

SWIFT_CLASS("_TtC27ProjectName_Summary11MyClass")
@interface MyClass : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

如果需要确保正在生成这些标头,请打开终端并使用此命令

find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h"

您应该会看到每个目标的一个标题

在这些更改之后发生在我身上的另一个问题是它开始在我没有触及的 ObjectiveC 代码上给出错误。问题是由于导入的位置,如此处所述

#import 隐藏的桥接头在 .m 文件顶部的确切位置可以产生影响。问题的常见迹象是您收到“未知类型名称”编译错误,其中未知类型是在 Objective-C 中声明的类。解决方案是在 #import 隐藏桥接头之前 #import 包含 Objective-C 文件中未知类型声明的 .h 文件。必须这样做可能会很烦人,特别是如果有问题的 Objective-C 文件不需要知道这个类,但它解决了问题并允许继续编译。

最后,代码在设备和模拟器上编译并运行!

原始答案

你也可以试试这个,你需要为框架和应用程序目标导入 -Swift.h

例如 :

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <Foundation/Foundation.h>
#import "XLPagerTabStrip-Swift.h"
#import "RealmSwift-Swift.h"
...... // Add all frameworks, subclasses, and dependance ios frameworks
#import  "MyProject-Swift.h"

您可以阅读这篇文章如何导入文件头和检查路径

于 2018-10-08T09:40:25.767 回答
0

您需要导入<Target>-Swift.h文件。这称为 Objective-C 生成的接口标头名称。

您可以在 Target 的构建设置中找到它。

在此处输入图像描述

该文件由编译器自动生成,需要在 Objective-C 文件中导入。

于 2018-10-08T09:19:56.553 回答