首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Swift框架-在Objective类中使用Swift类引用

Swift框架-在Objective类中使用Swift类引用
EN

Stack Overflow用户
提问于 2018-10-08 09:13:23
回答 2查看 2.3K关注 0票数 0

我正在创建Swift框架,在其中我必须使用Objective类。所以我浏览了链接。这是我的框架的公共标题:

代码语言:javascript
代码运行次数:0
运行
复制
#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类。这是:

代码语言:javascript
代码运行次数:0
运行
复制
#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

EN

回答 2

Stack Overflow用户

发布于 2018-10-08 09:19:56

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

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

这个文件是由编译器自动生成的,需要导入到Objective文件中.

票数 0
EN

Stack Overflow用户

发布于 2018-10-08 09:40:25

更改SWIFT_OBJC_INTERFACE_HEADER_NAME构建设置,并使其在不同目标之间保持相同。为此,请将生成此属性的指令从$(SWIFT_MODULE_NAME)-Swift.h更改为$(PROJECT_NAME)-Swift.h,如解释的这里所示

完成此操作后,按Alt并进入“产品”菜单,即可创建“清洁生成”文件夹。由于头的名称在目标之间共享,现在可以在.m ObjectiveC文件中导入一次,所有目标都可以从Swift类中受益。

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

代码语言:javascript
代码运行次数:0
运行
复制
SWIFT_CLASS("_TtC27ProjectName_Summary11MyClass")
@interface MyClass : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

如果需要确保生成这些标头,则打开一个终端并使用以下命令

代码语言:javascript
代码运行次数:0
运行
复制
find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h"

您应该看到每个目标的一个标头。

在这些更改之后发生在我身上的另一个问题是,它开始在ObjectiveC代码上产生我没有接触到的错误。这个问题是由于进口的位置造成的,据报道是这里

在.m文件顶部,您#导入隐藏的桥接标头的位置可能会有所不同。常见的问题迹象是,您得到了一个“未知类型名称”编译错误,其中未知类型是在Objective中声明的类。解决方案是#导入目标-C文件中包含未知类型声明的.h文件,然后再导入隐藏的桥接头。如果目标-C文件不需要知道这个类,但是它解决了这个问题并允许编译进行,那么必须这样做可能会带来麻烦。

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

原始答案

您也可以尝试这样做,您需要为框架和应用程序目标导入-Swift.h。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
#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"

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52698951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档