Swift/ObjC circular import

好久不见. 提交于 2020-01-14 08:43:19

问题


I am working on an existing large codebase that is predominately Objective-C but is in the process of converting to Swift.

New classes are being implemented in Swift, but some of these classes need to be accessed from existing ObjC code. In an attempt to follow both ObjC and Swift best practices, the new classes do not have a prefix, but are defined with a prefix for ObjC.

/**
 Create contrived class that is named XXClassA in ObjC and ClassA in Swift.
 */
@objc(XXClassA) class ClassA: NSObject {
    let foo = "bar"
}

So far this has been working great; Swift code uses ClassA() and ObjC uses [[XXClassA alloc] init]. Once all ObjC code that references XXClassA is removed, @objc(XXClassA) can also be removed from the Swift class.

Unfortunately this breaks down if you have an ObjC class reference XXClassA and then the Swift code attempts to use that new class inside of ClassA.

Say I create an ObjC class, named XXClassC and it instantiates itself using an XXClassA (which is really the Swift class 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

The circular reference is now in place. If I attempt to use XXClassC from inside of the ClassA, the initializer is not available.

If I redefine ClassA as this instead, all is well again.

class XXClassA: NSObject {
    let foo = "bar"
}

I understand why this is happening and the fix I have in place, however I want to continue to use this pattern of prefixed ObjC classes. Any ideas on how to avoid the circular import, but also keep the naming convention?

Full code sample here: https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38


回答1:


I'm having the same problem. My workaround is:

  • Use an objc-style prefixed name for the Swift class.
  • Add a typealias: typealias ClassA = XXClassA.
  • Always use the unprefixed name from Swift code.

With this pattern it's at least easy to remove the prefix when the last objc dependency is gone.



来源:https://stackoverflow.com/questions/35590015/swift-objc-circular-import

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!