2016-02-23 15 views
6

私は主に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を使用しようとすると、イニシャライザは使用できません。

enter image description here

私が代わりにこのようにClassAを再定義した場合、すべてが再び順調です。なぜこれが起こっている

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

は、私が理解し、私の場所に持っている修正は、しかし、私は、接頭辞にObjCクラスのこのパターンを使用し続けたいと思います。どのように循環インポートを避けるために任意のアイデアだけでなく、命名規則を維持する?ここ

完全なコードサンプル:https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38

答えて

0

私は同じ問題を抱えています。私の回避策は次のとおりです。

  • Swiftクラスには、接頭辞付きのobjc形式の名前を使用してください。
  • タイプA:typealias ClassA = XXClassAを追加してください。
  • Swiftコードの固定名を使用してください。

このパターンでは、最後のobjc依存関係がなくなったときに接頭辞を削除するのは少なくとも簡単です。