私は主にObjective-Cですが、Swiftに変換中の既存の大きなコードベースで作業しています。Swift/ObjC circular import
新しいクラスは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"
}
これまでのところ、これは素晴らしい動作をしています。スウィフトコードはを使用し、ObjCは[[XXClassA alloc] init]
を使用します。 XXClassAを参照するすべてのObjCコードが削除されると、@objc(XXClassA)
もSwiftクラスから削除できます。
残念ながら、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
私はXXClassC
という名前の、にObjCクラスを作成し、それが(本当にスウィフトクラスClassA
である)XXClassA
を使用して自分自身をインスタンス化すると言います。 ClassAの内部からXXClassCを使用しようとすると、イニシャライザは使用できません。
私が代わりにこのようにClassAを再定義した場合、すべてが再び順調です。なぜこれが起こっている
class XXClassA: NSObject {
let foo = "bar"
}
は、私が理解し、私の場所に持っている修正は、しかし、私は、接頭辞にObjCクラスのこのパターンを使用し続けたいと思います。どのように循環インポートを避けるために任意のアイデアだけでなく、命名規則を維持する?ここ
完全なコードサンプル:https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38