繁体   English   中英

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

[英]Swift framework - Use Swift class reference in Objective-C class

我正在创建必须使用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”

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

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

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

在此处输入图片说明

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

更改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代码错误。 问题出在这里 ,是由于进口的位置:

恰好在.m文件顶部的#import位置,隐藏的桥接标头可以有所作为。 麻烦的通常迹象是,您收到“未知类型名称”的编译错误,其中未知类型是在Objective-C中声明的类。 解决方案是,在#import隐藏的桥接头文件之前,#import .h文件也包含Objective-C文件中的未知类型的声明。 这样做可能会很烦,特别是如果所讨论的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"

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM