我正在处理一个现有的大型代码库,主要使用Objective-C,但正在转换为Swift。
新的类正在用Swift实现,但其中一些类需要从现有的ObjC代码中访问。为了遵循ObjC和Swift的最佳实践,新类没有前缀,但对于ObjC,它们被定义为具有前缀。
到目前为止,这个方法一直很好用;Swift 代码使用
比如说我创建了一个名为
现在已经出现了循环引用。如果我尝试从ClassA内部使用XXClassC,则初始化程序不可用。 如果我将ClassA重新定义为这个,一切都会再次恢复正常。
我理解为什么会出现这种情况,以及我已经采取的修复措施,但是我想继续使用这种带前缀的ObjC类的模式。有什么想法可以避免循环导入,同时保持命名约定吗?
完整代码示例在此处:https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38
新的类正在用Swift实现,但其中一些类需要从现有的ObjC代码中访问。为了遵循ObjC和Swift的最佳实践,新类没有前缀,但对于ObjC,它们被定义为具有前缀。
/**
Create contrived class that is named XXClassA in ObjC and ClassA in Swift.
*/
@objc(XXClassA) class ClassA: NSObject {
let foo = "bar"
}
到目前为止,这个方法一直很好用;Swift 代码使用
ClassA()
,而 ObjC 使用 [[XXClassA alloc] init]
。但是,如果有一个 ObjC 类引用了 XXClassA,然后 Swift 代码试图在 ClassA 中使用那个新类,这种方法就会失败。比如说我创建了一个名为
XXClassC
的 ObjC 类,并使用 XXClassA
(实际上是 Swift 类 ClassA
)来实例化它自己。//
// XXClassC.h
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class XXClassA;
@interface XXClassC : NSObject
-(instancetype)initWithA:(XXClassA *)classA;
@end
NS_ASSUME_NONNULL_END
现在已经出现了循环引用。如果我尝试从ClassA内部使用XXClassC,则初始化程序不可用。 如果我将ClassA重新定义为这个,一切都会再次恢复正常。
class XXClassA: NSObject {
let foo = "bar"
}
我理解为什么会出现这种情况,以及我已经采取的修复措施,但是我想继续使用这种带前缀的ObjC类的模式。有什么想法可以避免循环导入,同时保持命名约定吗?
完整代码示例在此处:https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38