2016-04-05 8 views
1

Xcodeがブリッジヘッダーのインポートに失敗したとのエラーが表示され続けます。私はSwiftヘッダー(ProjectName-swift.h)をインポートする特定のクラスをインポートするときにのみこれが発生することに気付きました。Swiftヘッダーをインポートするブリッジヘッダーにファイルをインポートします。

Swiftヘッダをインポートするクラスをインポートすることはできますか?そうでない場合は、SwiftクラスのSwiftヘッダーをインポートするクラスを使用して、ファイルに必要なSwiftコードを使用できるようにするにはどうすればよいですか?

答えて

6

クラスのヘッダーファイルからSwiftヘッダーインポートをそのクラスの実装ファイルに移動し、@classを使用してSwiftクラスの前方宣言を行います。例えば

、あなたは、あなたのヘッダファイルでのご@interface前に、MySwiftClassという名前スウィフトクラスのスウィフトヘッダをインポートする必要がある場合は、次の行を置く:あなたのヘッダーをコンパイルすることができます

@class MySwiftClass; 

をSwiftヘッダーファイルを直接インポートすることはありません。あなたの実装は引き続きそれを必要とするので、import文を実装ファイルに移動する必要があります。

宣言を転送しようとしているものがプロトコルの場合も同じことができます。ただ@protocolキーワードを使用します。

クラスまたはプロトコルの前方宣言を使用するのは、Objective-Cコードのみが使用されている場合でも循環依存を中断するObjective-Cの方法です。時には、同じヘッダファイルに定義されているクラスまたはプロトコルに対して前方宣言を使用する必要がある場合もあります。たとえば、相互に参照するプロトコルとクラスがある場合です。

+0

あなたの答えは、私が見つけたプロトコルに関するビットを除いて100%正確です。これを読んでいる人には、自動生成されたSwiftヘッダーのインポートを.mに動かすことになります。クラスをSwiftプロトコルに準拠させて宣言する必要がある場合は、それをあなたの@interface行に従っているとマークする必要があります。 mファイルも同様です。私はチェックし、これは依然として、conformsToProtocolに対してYESを返し、循環依存性を壊します。正解に導いてくれてありがとう! –

+0

@BillLはい、あなたは、クラスを.mファイルのクラス拡張のプロトコルに従うものとしてマークすることができます。それは間違いなくそれを処理する最良の方法です。特に、クラスがそのプロトコルに準拠していることを他のクラスで知る必要がない場合は、実装の詳細だけです。しかし、プロトコルの前方宣言はObjective-Cヘッダーファイルで頻繁に使用されます。具体的には、クラスにデリゲートとデータソースプロトコルが定義されている場合です。 'UITableView'ヘッダファイルは例えば' UITableViewDataSource'の順方向宣言を持っています。 – Gavin

+0

しかしSwiftで宣言された 'enum'はどうですか? :( – Rich

関連する問題