web-dev-qa-db-ja.com

Objective C to Swift複数のターゲットを持つヘッダーファイル

私はSwiftクラスを(ターゲット 'MyApp'の)Objective Cからimportステートメント経由で正常に呼び出しています:

#import "MyApp-Swift.h"

「MyAppLite」という新しいターゲットを作成しました

新しいターゲットをコンパイルすると、コードに「MyApp-Swift.h」が必要ですが、コンパイラが「MyAppLite-Swift.h」を作成しているため、エラーが発生します

したがって、条件付きSwift/ObjCヘッダーを作成する必要があります#import私がコンパイルしているターゲットに対して。

どのようにこれを行うことができますか、またはより良い方法がありますか?

62
Fittoburst

Product Module NameBuild Settings設定をモジュール全体で同じに設定することもできます($(PROJECT_NAME)に設定します)。これにより、生成される<project>-Swift.hファイルはすべてのモジュールで同じ名前になります。これにより、プリプロセッサマクロを追加/確認する必要がなくなります。

75
C0D3LIC1OU5

この問題に対処するために私が見つけた最良の方法は、Xcodeの共有プロジェクト設定です。次の設定を検索できます。

Objective-Cで生成されたインターフェイスヘッダー名*

その値を「MyProject-Swift.h」などの共通のヘッダー名に設定すると、各ターゲットに適用され、Objective-Cファイルでインポート宣言を安全に使用できます。これにより、必要に応じて、ターゲットごとに一意の製品モジュール名を引き続き使用できます。

Xcodeバージョン6.4(6E35b)でこれをテストしました。

*注意:これは、Swiftコンパイラー設定の下に表示されます。この設定は、Swiftソースファイルをプロジェクトに追加した場合にのみ表示されます。 Swiftソースが関連付けられていない場合、Swiftコンパイラオプションはそのターゲットのビルド設定に対して表示されません。

がんばろう!

52
Mike Fay

ターゲットまたはプロジェクトの名前を変更する場合、または_Swift_MODULE_NAME_を意図したとおりに使用する場合、以前の回答にはいくつかの問題があります。

最も普遍的なソリューションは、ターゲットではなくプロジェクトのビルド設定で_Swift_OBJC_INTERFACE_HEADER_NAME_(「Objective-C Generated Interface Header Name」)を次のように変更することです。

  • $(PROJECT_NAME)-Swift.h —プロジェクトごとに1つ。
  • $(Swift_MODULE_NAME)-Swift.h —モジュールごとに1つ(デフォルト値)。

enter image description here

27
Dmitry Isaev

まあ、私が修正できる唯一の方法は...

#ifdef IS_LITE
#import "MyApp_Lite-Swift.h"
#else
#import "MyApp-Swift.h"
#endif

製品モジュール名に「違法」な文字が含まれている場合は、アンダースコアに置き換える必要があることに注意してください。

お役に立てば幸いです!

5
Fittoburst

適切な#import <project> -Swift.hステートメントを、各ビルド(ターゲット/スキーム)に対して定義/追加されたプレフィックスヘッダーファイル(<project> -Prefix.pch)に入れます。

5
Will

唯一の作業方法は次のとおりです。

1-最初のターゲットから(動作中のブリッジがあります)ビルド設定 select Objective Cブリッジングヘッダー
2-コピー目的Cブリッジングヘッダー
3-他のターゲットを開く ビルド設定
4-貼り付け5-ヘッダーファイルを新しいヘッダーファイルに変更します(ターゲットB.h)

(2つのターゲットに対してこのオプションがあります)

0
Ahmad Albash