Swift/ObjC 循环引用

7
我正在处理一个现有的大型代码库,主要使用Objective-C,但正在转换为Swift。
新的类正在用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,则初始化程序不可用。

enter image description here

如果我将ClassA重新定义为这个,一切都会再次恢复正常。
class XXClassA: NSObject {
    let foo = "bar"
}

我理解为什么会出现这种情况,以及我已经采取的修复措施,但是我想继续使用这种带前缀的ObjC类的模式。有什么想法可以避免循环导入,同时保持命名约定吗?
完整代码示例在此处:https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38
1个回答

0

我遇到了相同的问题。我的解决方法是:

  • 为Swift类使用objc风格的前缀名称。
  • 添加一个类型别名:typealias ClassA = XXClassA
  • 始终从Swift代码中使用无前缀的名称。

有了这种模式,当最后一个objc依赖项消失时,至少可以轻松地删除前缀。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接