私は幸運なしに混合されたSwiftとObjectiveCプロジェクトで作業しようとしています。
私のプロジェクトは6つのターゲットで構成されています。
ターゲットメンバーシップ(アプリ)が1つあり、App-Bridging-Header.hから渡されるObjectiveCコードを使用するSwiftクラスを追加できましたObjectiveC into Swift code "パラダイムは魅力のように機能します。
代わりに、「ObjectiveCコードへの迅速な」パラダイムに苦労しています。特定のケースでは、4つのターゲットのメンバーであるObjectiveC .mファイル内で新しいSwift=クラスを使用する必要があります。
私がこれまでやってきたことはこれです:
私は 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クラスが複数のターゲットに対して定義され、ObjectiveCファイルがそれらの複数のターゲットによって使用される場合、動作しません。ビルドエラーは次のようになります。ターゲットX-> "ProjectName_TargetY-Swift.h "ファイルが見つかりません。ターゲットが他のターゲット-Swift.hファイルを見ることができないようです。
私は何を間違えていますか?ご協力いただきありがとうございます
私が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ファイルがこのクラスについて知る必要がない場合、これを行うことは煩わしいことがありますが、問題を解決し、コンパイルを続行できます。
最後に、コードはコンパイルされ、デバイスとシミュレーターで実行されます!
これは質問の解決策ではありませんが、多くの人がこのページで<ModuleName>-Swift.h
ファイルが見つからない(私のように)もう1つ考えられる理由を追加したい:
Swiftファイルにコンパイラーの問題がある場合、ヘッダーがXcodeによって生成されない可能性があり、そのためファイルが欠落しています。
少なくとも私の場合、<ModuleName>-Swift.h not found
は、Swiftファイルでコンパイルエラーを修正すると消えました。
私にとっての解決策は、生成されたSwiftヘッダーを<>
構文:
#import <OtherTargetWithSwiftClass/OtherTargetWithSwiftClass-Swift.h>
私は同様の問題を抱えており、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=ヘッダーファイルは、さらなるコンパイルとビルドのために作成され始めました。
私の場合、iOSアプリサブプロジェクト、フレームワークサブプロジェクト、およびCocoaPods Podsサブプロジェクトを含むワークスペースがあります。ファイルがまだPodsサブプロジェクトによって作成されていないため、フレームワークサブプロジェクトで「ModuleName-Swift.hファイルが見つかりません」というエラーが発生しました。
Xcodeにサブプロジェクト間の依存関係を伝える方法があるかどうかはわかりませんが、左側のProject Navigatorでそれらを並べ替えるだけです。
その後、うまくいきました!
私の場合、Xcode 8では問題なく動作しますが、
#import "Project-Swift.h"
lucioBで説明されているように、インポートが欠落している
Xcode 9を使用すると、これらのエラーが削除されます