web-dev-qa-db-ja.com

ModuleName-Swift.hファイルがxcode8に見つかりません

私は幸運なしに混合されたSwiftとObjectiveCプロジェクトで作業しようとしています。

私のプロジェクトは6つのターゲットで構成されています。

  • アプリ
  • コア
  • CoreTest
  • 概要
  • WatchKit拡張機能
  • WatchKitアプリ

ターゲットメンバーシップ(アプリ)が1つあり、App-Bridging-Header.hから渡されるObjectiveCコードを使用するSwiftクラスを追加できましたObjectiveC into Swift code "パラダイムは魅力のように機能します。

代わりに、「ObjectiveCコードへの迅速な」パラダイムに苦労しています。特定のケースでは、4つのターゲットのメンバーであるObjectiveC .mファイル内で新しいSwift=クラスを使用する必要があります。

私がこれまでやってきたことはこれです:

  1. 4つのメンバーシップ(App、Core、Summary、WatchKit Ext)を指定して、新しいSwiftファイルをCoreプロジェクトに追加します)
  2. XCodeは、3つのプロジェクトCore、Summary、およびWatchKit Ext(App-Bridging-Header.hは以前に使用されてから既に存在します)に対して-Bridging-Header.hを作成するように要求し、同意します(しないでください) Swift class but nevermind)を追加した同じグループフォルダー内にこれらのファイルを作成する理由を知っている
  3. Swiftクラスを作成します@ objcキーをclassの前に追加します
  4. Objective-C Generated Interface Header Nameがすべてのモジュールに設定されているかどうかを確認します。
  5. Defines ModuleがすべてのモジュールでNoに設定され、メインプロジェクトでYesに設定されているかどうかを確認します。
  6. 4つのターゲットすべての-Swift.hファイルのインポートを書き留めます
  7. Objective-Cクラス内では、新しいSwiftクラスを使用しようとしますが、明らかにオートコンプリートでも動作するようです
  8. プロジェクトをビルドしようとしましたが、-Swift.hファイルが見つからないと言って失敗します

私は Appleのミックスアンドマッチガイド および多くのSOを含むスレッド this one に従って、明らかに同じ問題に対処しているようです私のが、それは動作しません。

this および this も見ましたが、動作しませんでした。

派生データを削除するだけでなく、プロジェクト全体を数回クリーニングすることもできました。

編集1:詳細

これはmy Swift class import RealmSwiftの宣言です

@objc class MyClass: Object {}

これは、ObjectiveC内のSwiftクラスの使用法のスニペットです

MyClass *app = [[MyClass alloc] init];

#import ...- Swift.hの使用を避けた場合、ビルドはUndeclared idenfier "MyClass"を使用していると言って失敗し、これは適切です。

#import ...- Swift.hファイルを使用すると、モジュールXがモジュールYを見つけられない、などと表示されます。

編集2:Swiftモジュール名

Swift_OBJC_INTERFACE_HEADER_NAME各ターゲットのプロパティを見ると、この構文を使用してビルドされていることがわかりました$(Swift_MODULE_NAME)-Swift.h変更する必要がありますかSwift_MODULE_NAME to MODULE_NAME

編集3:インポート

これは、。= ObjectiveCファイルのSwiftヘッダーのインポートのセットです。相対的なビルド設定プロパティで指定されたモジュール名を使用しています。WatchKit拡張ターゲット以降、 '_'文字があることに注意してください。ターゲット名にスペースがあります。

#import "ProjectName_App-Swift.h"
#import "ProjectName_Core-Swift.h"
#import "ProjectName_Summary-Swift.h"
#import "ProjectName_WatchKit_Extension-Swift.h"

編集4:-Swift.hファイルの相互可視性

私は次を試しました:

  • ターゲットアプリでのみSwiftクラスを追加
  • XCodeがブリッジングヘッダーを作成しました
  • Appでのみ使用されるObjectiveCファイルに#import "ProjectName_App-Swift.h"を挿入しました
  • このファイル内のSwiftクラスを使用しました
  • コンパイルします!そして、Swiftクラスを使用することができます

Swiftクラスが複数のターゲットに対して定義され、ObjectiveCファイルがそれらの複数のターゲットによって使用される場合、動作しません。ビルドエラーは次のようになります。ターゲットX-> "ProjectName_TargetY-Swift.h "ファイルが見つかりません。ターゲットが他のターゲット-Swift.hファイルを見ることができないようです。

私は何を間違えていますか?ご協力いただきありがとうございます

25
LucioB

私がEdit 4で行った仮定は正しいものであることが判明しました。プロジェクトに複数のターゲットがある場合、「-Swift.h」ファイルをすべて1つの.m ObjectiveCファイルにインポートすることはできません。

したがって、採用しなければならない解決策が1つあり、Swift_OBJC_INTERFACE_HEADER_NAMEビルド設定を変更し、異なるターゲット間で同じにすることです。そうするには、このプロパティを生成する命令を$(Swift_MODULE_NAME)-Swift.hから$(PROJECT_NAME )-Swift.h説明通り here

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

Altキーを押して[製品]メニューに移動し、このClean Build Folderを実行した後。ヘッダーの名前はターゲット間で共有されるため、.m ObjectiveCファイルに一度インポートできるようになり、すべてのターゲットがSwiftクラスから恩恵を受けることができます。

ビルド後もエラーが表示される場合は、Cmdが名前をクリックしてXCodeからヘッダーに到達できることを確認してください。次のようなコードを含むファイルを開く必要があります。

Swift_CLASS("_TtC27ProjectName_Summary11MyClass")
@interface MyClass : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

これらのヘッダーが生成されていることを確認する必要がある場合は、ターミナルを開いてこのコマンドを使用します

find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h"

ターゲットごとに1つのヘッダーが表示されます

これらの変更後に私に起こった別の問題は、私が触れなかったObjectiveCコードにエラーを与え始めたことです。問題は、報告されたインポートの位置に起因していました here

.mファイルの最上部のどこに隠されたブリッジングヘッダーを#importするかが違いを生むことができます。トラブルの通常の兆候は、「不明なタイプ名」コンパイルエラーが発生することです。不明なタイプは、Objective-Cで宣言されたクラスです。解決策は、不明なブリッジヘッダーを#importする前に、Objective-Cファイル内の不明な型の宣言を含む.hファイルも#importすることです。特に、目的のObjective-Cファイルがこのクラスについて知る必要がない場合、これを行うことは煩わしいことがありますが、問題を解決し、コンパイルを続行できます。

最後に、コードはコンパイルされ、デバイスとシミュレーターで実行されます!

45
LucioB

これは質問の解決策ではありませんが、多くの人がこのページで<ModuleName>-Swift.hファイルが見つからない(私のように)もう1つ考えられる理由を追加したい:

Swiftファイルにコンパイラーの問題がある場合、ヘッダーがXcodeによって生成されない可能性があり、そのためファイルが欠落しています。

少なくとも私の場合、<ModuleName>-Swift.h not foundは、Swiftファイルでコンパイルエラーを修正すると消えました。

7
Jens

私にとっての解決策は、生成されたSwiftヘッダーを<>構文:

#import <OtherTargetWithSwiftClass/OtherTargetWithSwiftClass-Swift.h>
7
cornr

私は同様の問題を抱えており、StackOverflowや他のいくつかのソースに関する仲間の開発者からの提案に従っている間、問題を理解するために丸一日を費やしました。

Xcode 7.3.1からXcode 8.2.1にアップグレードし、Swift 2.2からSwift 3.0.1にアップグレードしました。
私の場合、私はPROJECT_NAME-Swift.hファイルは次の場所で作成されませんでした。

~/Library/Developer/Xcode/DerivedData/PRODUCT-NAME-hdkrxixrxbiorwesffpqvefxsrzl/Build/Intermediates/PRODUCT-NAME.build/Debug/PRODUCT-NAME.build/Objects-normal/x86_64/PRODUCT-NAME-Swift.h.

どういうわけか、上記のパスからこのヘッダーファイルを参照しようとするため、エラーになると思います。手動でコピーしました。この後、クリーンビルドを実行しませんでした。これで私の問題は解決し、Swift=ヘッダーファイルは、さらなるコンパイルとビルドのために作成され始めました。

3
retrocoder84

私の場合、iOSアプリサブプロジェクト、フレームワークサブプロジェクト、およびCocoaPods Podsサブプロジェクトを含むワークスペースがあります。ファイルがまだPodsサブプロジェクトによって作成されていないため、フレームワークサブプロジェクトで「ModuleName-Swift.hファイルが見つかりません」というエラーが発生しました。

Xcodeにサブプロジェクト間の依存関係を伝える方法があるかどうかはわかりませんが、左側のProject Navigatorでそれらを並べ替えるだけです。

  1. ポッド
  2. フレームワーク
  3. iOSアプリ

その後、うまくいきました!

0
ScottyB

私の場合、Xcode 8では問題なく動作しますが、

#import "Project-Swift.h"

lucioBで説明されているように、インポートが欠落している

Xcode 9を使用すると、これらのエラーが削除されます

0
Ted