当Swift桥接头导入导入Hopscotch-Swift.h本身的文件时,如何防止循环引用

Sam*_*ohn 43 cocoa objective-c swift

我正在将Swift集成到一个大型的现有Objective C项目中,并且遇到了我认为是循环引用的问题.

有问题的课程如下:

Objective C控制器

#import "Hopscotch-Swift.h"

@interface MyController : UIViewController<MyProtocol>
   ...
@end
Run Code Online (Sandbox Code Playgroud)

Swift协议

@objc protocol MyProtocol: NSObjectProtocol {
   ...
}
Run Code Online (Sandbox Code Playgroud)

桥接标题

#import "MyController.h"
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,因为该Hopscotch-Swift.h文件不会生成.

我认为这是由于循环引用错误,因为我可以导入Hopscotch-Swift.h到未包含的目标c标头中,Hopscotch-Bridging-Header.h并且它可以正常工作.

是否有针对此问题的解决方法,还是应该向Apple提交雷达?

rud*_*udd 25

在您的情况下,前向声明应该有效.

在你的.h:

@protocol MyProtocol;

@interface MyController : UIViewController<MyProtocol>

@end
Run Code Online (Sandbox Code Playgroud)

在你的.m:

#import "HopScotch-Swift.h"

如何添加-Swift.h头中使用的前向类引用?和Swift互操作性指南:

如果在Swift代码中使用自己的Objective-C类型,请确保在将Swift生成的头导入要从中访问Swift代码的Objective-C .m文件之前导入这些类型的Objective-C头.

  • 我不确定这对你有用,@ kleezy,因为[你无法转发声明你在Objective-C中实现的协议](http://stackoverflow.com/a/11533804/35690).如果您尝试运行上面的代码,您将收到警告`无法找到'MyProtocol'的协议定义 (9认同)

Ech*_*lon 11

我试图在Objective-C协议中使用Swift类时遇到了这个问题,其中协议也是由另一个Swift类实现的.它充满了循环引用,我猜想尝试循环生成桥接头可能是一个问题,而不是"正常"循环包含问题.

对我来说,解决方案是在协议声明之前使用前向声明: -

// don't include the MyProject-Swift.h header

// forward declaration of Swift classes used
@class SwiftClass;

@protocol MyProtocol <NSObject>
- (SwiftClass *)swiftClass;
@end
Run Code Online (Sandbox Code Playgroud)


Joc*_*fer -1

您可以在您怀疑会触发循环引用的 .h 文件中执行以下操作:

#ifndef MY_HEADER_H
#define MY_HEADER_H
your header file
#endif
Run Code Online (Sandbox Code Playgroud)