Swift框架-在Objective-C类中使用Swift类参考

时间:2018-10-08 09:13:23

标签: ios objective-c swift swift-framework

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

#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

2 个答案:

答案 0 :(得分:0)

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

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

enter image description here

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

答案 1 :(得分:0)

更改 SWIFT_OBJC_INTERFACE_HEADER_NAME 构建设置,并使其在不同目标上相同。为此,请按照here

中的说明,将生成此属性的指令从 $(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代码带来错误。问题是由于here报告的导入位置引起的:

  

.m文件的确切位置是#import隐藏的桥接   标头可以有所作为。通常麻烦的迹象是你   出现“未知类型名称”编译错误,其中未知类型是   在Objective-C中声明的类。解决方案是#import .h文件   在Objective-C中包含未知类型的声明   #导入隐藏的桥接标头之前,请先检查这些文件。有   这样做可能会很烦人,尤其是如果在   问题无需了解此类,但可以解决   问题,并允许进行编译。

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

Original answer

您也可以尝试一下, 您需要同时为框架和应用目标导入-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"

您可以阅读this文章如何导入文件头并检查路径