私は最近、Swiftを既存のプロジェクトに追加して、実際の方法で試してみることに取り組んでいます。
プロジェクトにSwiftのソースファイルを追加しても、 "Bridging Header"(つまりObjective-CからSwiftへ)を取得するのに問題はありません。
しかし、Swiftクラスを*-Swift.h
とマークするか、またはObjCクラスのサブクラスとして公開することになっている@objc
ヘッダーファイルは、 どこにも 見つけられる :-(
Swiftで書かれた私の新しいサブクラスの使用方法を達成するための具体的な手順は、メインのアプリケーションコード(まだObjective-Cです)にはありません。
私が開発をリードしているアプリはかなり大きなコードベース(70.000行)を持っているので、一度にそれを移行することは問題外です。
今それは働きます。
最後に動作します。助けてくれてありがとう:-)
私は同様の問題を抱えていたし、あなたが追加することができることがわかった
#import “ProductModuleName-Swift.h”
アンブレラヘッダーを見つけるための.hファイルではなく、obj-c .mファイルへ
ファイルを生成する前にallビルドエラーを修正する必要があることがわかりました。
私にとっての問題は、それがchicken/Eggの問題であるということでした。実際に#import
ステートメントをコメントアウトするまで、ビルドエラーが発生しなかったことです。
//#import "ProductModuleName-Swift.h"
私のSwiftコードには他にもたくさんのエラーがあることがわかりました。
これらの新しいエラーを修正してソースの構築に成功したら、#import
とbingoのコメントを外します。ヘッダーが作成され、正しくインポートされました:)
私のような人なら、おそらくヘッダー名が間違っているでしょう。しばらく頭をぶつけた後、DerivedDataでファイルを探しました。私の設定では(標準の派生データフォルダを使用しています)、
cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'
それを見つけるでしょう。そのフォルダ内に何も一致しない場合、Xcodeはそれを生成していません。
Xcode Version 6.2(6C86e)を使用しています
プロジェクトモジュール名にスペースが含まれる場合は、必須スペースをアンダースコアに置き換えます。
たとえば、プロジェクト名が "My Project"の場合は、次のようにします。
#import "My_Project-Swift.h"
*唯一の重要なことは:*
ターゲットで定義済みの「製品モジュール名」を使用し、その後に-Swift.hを続けます。
#import <Product Module Name>-Swift.h
// in each ObjectiveC .m file having to use Swift classes
// no matter in which Swift files these classes sit.
「モジュールの定義」パラメータが「はい」または「いいえ」に設定されていても、「製品モジュール名」プロジェクトが設定されていなくても問題ありません。
注意:Swiftクラスは、ObjectiveC/Foundation ||に公開されるためには、NSObjectから派生するか、@ objc属性でタグ付けされる必要がありますココア ...
私があなたがこれに関して問題を見つけるかもしれないもう一つの理由を加えたいと思いました - 私はSwiftとObjective-Cコードを混合したフレームワークを作成していました。 Swiftクラスをフレームワークの外にインポートすることができませんでした - -Swift.hファイルを確認しましたが、生成中でしたが空でした。
問題は非常に、非常に単純であることがわかった - 私は私のSwiftクラスのどれも公に宣言していなかった! publicキーワードをクラスに追加するとすぐに、フレームワークの内側と外側のクラスからそれらを使用することができました。
また、フレームワークの内側(別の回答で言及されているように、.mファイルの内側のみ)に注意してください。-Swift.hファイルを次のようにインポートする必要がありました。
#import <FrameworkName/FrameworkName-Swift.h>
私は同じ問題を抱えていました。あなたは設定を調整しなければならないようです(モジュールと製品モジュール名を定義します)前にあなたはあなたの最初のSwiftファイルを追加します。
後で実行すると、さらにSwiftファイルを追加したり、Swiftファイルを削除して新しいファイルを作成した場合でも、このプロジェクト用の "* -Swift.h"ファイルは生成されません。
ModuleName-Swift.hの別のバリエーションが生成されていません。
IOS Charts をプロジェクトに含めることにしましたが、同じディレクトリ内のソースを混ぜたくないので、Charts Projectフォルダーをコードのプロジェクトフォルダーの隣に配置しました。 Chartsプロジェクトをプロジェクトのナビゲーターバーにドラッグし、プロジェクトターゲットのEmbedded Binariesリストにフレームワークを含めて、一般プロジェクト設定で-を設定しました。 埋め込みコンテンツに含まれるSwift Codeプロジェクトの[はい]に切り替えBuild SettingsBuild Optionsセクションのタブ。
私のプロジェクトのmoduleName-Swift.hファイルは、ここで提案されている他のスイッチや設定に関係なく、決して生成されません。最後に、-Swift.hファイルを探すLou Zの方法を使用して、Charts.framework/Headers /のプロジェクトのxcode Buildディレクトリの深部にCharts-Swift.hファイルが生成されているのを見ました。
プロジェクトのソースディレクトリにコードを含めずに、Daniel Gindiのios-charts Swiftパッケージを使用するソリューションは、次を追加することでした。
#import "Charts/Charts-Swift.h"
プロジェクトのデータをチャート化するモジュールへ。
ファイル名の前には必ずTargetという名前が付きます。これは製品名と呼ばれますが、実際にはターゲット名です。ですから、新しいターゲット用にビルドしたい場合は、that_target-Swift.h
ファイルを用意する必要があります。
これを処理する1つの方法は
MY_TARGET=1
。各ターゲットのプロジェクト設定 - >ビルド設定 - >プリプロセッサマクロでこれを追加します。これらの行をPCHファイルに追加してください。
#if MY_TARGET==1
#include "My_Target-Swift.h"
#Elif THAT_TARGET==1
#include "That_Target-Swift.h"
#endif
PCHファイルを使用する利点は、どこにでもヘッダーを含める必要がないということです。
これはうまくいくはずです。
Swiftを古いobjcプロジェクトで使用しようとした私の経験を共有できるようにします。 Defines module
をYES
に設定する必要はありませんでした。
私の場合、私は手動でobjc Bridging Headerがあることを確認する必要がありました。生成されたインタフェースヘッダ名だけが私のビルド設定に存在していました。
これにより、MyApp-Swift.hファイルが生成されますが、私のSwiftクラスの痕跡は残りません。
Appleのドキュメントには、最初のSwiftファイルを追加するときにブリッジングヘッダを作成するように促されると書かれています。そうではありません。手動でMyApp-Bridging-header.h
ファイルを追加し、それを「Objective-C Bridging Header」フィールドで参照しました。これにより、MyApp-Swift.hファイルにSwiftクラスが追加されました。
ドキュメント: Objective-CへのSwiftのインポート
XCodeが実際に-Swift.hヘッダーを(DerivedDataの奥深くに)生成しているが、それがSwiftクラスを参照していない場合は、必ずブリッジヘッダーも定義してください。ドキュメントの読み方は、SwiftからObjective-Cを呼び出すために必要なことだけを示唆していましたが、Objective-CからSwiftを呼び出すためにも必要なようです。
私の答えを参照してください。 https://stackoverflow.com/a/27972946/337392
編集:私は最終的にアップルのドキュメントで説明されて見つけたように、それは公共の対内部のアクセス修飾子のためです: -
デフォルトでは、生成されたヘッダはpublic修飾子でマークされたSwift宣言のためのインタフェースを含みます。アプリターゲットにObjective-Cブリッジングヘッダーがある場合は、内部修飾子でマークされたものも含まれます。
多くの人がここで持っていることを第二に、適切なスクリーンショットを追加すること。 SwiftとObj-Cコードは確かに共存できます。それは全然か無ゲームではない。
Objective-CのSwiftファイルにアクセスするには、(。m/implementationファイルの)Obj-Cファイルにこの呼び出しを追加するだけです。
#import "{product_module_name}-Swift.h"
({product_module_name}はプロジェクトの製品モジュール名を表します)。製品モジュール名を推測したり、スペースや特殊文字を使用してコーナーケースを見つけ出したりするのではなく、プロジェクトの[ビルド設定]タブに移動して「製品モジュール名」と入力するだけです。私のものは私が期待していなかったものでした。混乱しているならこのスクリーンショットをチェックしてください。
そして、Obj-cコードをSwiftで動作させるためには、ブリッジングヘッダファイルを追加し、そこに関連するObj-Cヘッダをインポートするだけです。
さて、ここにあなたが本当に必要とするすべてのものがあります!
1.追加したSwiftファイルをすべて削除し、コードをコンパイルします。エラーはありません。
2. [プロジェクト]ビルド設定に移動し、製品モジュール名を設定します。プロジェクトには、スペースを含まない製品モジュール名を付ける必要があります。
3.プロジェクトの[ビルド設定]の[パッケージ]の下で、[ターゲット]ではなく[定義モジュール]を[はい]に設定する必要があります
4.ファイル - > newFile - >で、SwiftファイルまたはView Controllerを作成します。
それはそれを作ることができるように、ブリッジングヘッダを作成するように要求します。一度拒否した場合は、手動で-Bridging-Header.hを追加する必要があります。
5.コントローラに@objcを追加して、ObjectiveCに公開する必要があるSwiftファイルがいくつかあることをコンパイラに伝えます
6.プロジェクトをビルドして、#import "-Swift.h"をいずれかのObjective-Cコントローラにインポートすれば、うまくいきます。実際のファイルを見るためにそれをCommand-クリックすることができます!
お役に立てれば!
この答えは、Swiftクラスを呼び出すObjective-Cコードをすでに持っていて、このエラーを受け取り始めるというユースケースに対処します。
問題の修正方法
以下のステップは、最終的に私にとってすべての問題を解決しました。私は、「鶏と卵」について言及している人を上に読みましたが、それがまさにその概念であり、私がこの手順を導いたのです。この明示的なプロセスは、ヘッダーが生成されるまでSwiftクラスを参照しているObjective-Cコードを削除する必要があることを示しています。
注意:上記のようにスペースをアンダースコアに、Defines ModuleをYESに変更することに関する回答は、このプロセスを実行するときにも当てはまります。 the アップルのドキュメント 。
ブリッジングヘッダーパス
1つのエラーで、ProductModuleName-Bridging-Header.hファイルがビルドプロセス中に見つかりませんでした。この事実によりエラーが発生しました
<不明>:0:エラー:ブリッジヘッダ '/Users/Shared/Working/abc/abc-Bridging-Header.h'が存在しません
エラーを詳しく調べると、ファイルは実際には(間違ったパス)にあるため、記述された場所には存在しません。
'/Users/Shared/Working/abc/abc/abc-Bridging-Header.h'。ターゲット/プロジェクトのクイックサーチは手動で修正するための設定を構築し、abc-Swift.hファイルは再び自動生成されました。
最も重要なことはこのファイルは見えない!!!少なくともXcode 6 beta 5にあるということです。あなたのワークスペースには、 "YourModule-Swift.h"という名前のファイルはありません。モジュール名があり、moduleをyesに設定していることを確認し、それをObjective-Cクラスで使用してください。
Objective-Cクラスにヘッダーをインポートする必要があります。
#import “ProductModuleName-Swift.h”
自動的に生成され、「ターゲットのSwiftファイルはすべてこのimport文を含むObjective-Cの.mファイルに表示されます」との言及に基づいています。
"。"を使った人なら誰でも頭が上がります。そこにプロジェクト名。 Xcodeは「。」を置き換えます。 Swiftバージョンのブリッジングヘッダファイルの場合は、アンダースコア「_」を付けます。奇妙なことに、生成されたBridging-Header.hはピリオドをアンダースコアに置き換えません。
たとえば、My.Projectという名前のプロジェクトは、次のブリッジングヘッダファイル名を持ちます。
Bridging-Header.h(自動生成)
My.Project-Bridging-Header.h
Swift.h
My_Project.h
私はこれがピリオドを使っていて私のように動けなくなった人に役立つことを願っています。このファイルは次の場所にあります。
Macintosh HD /ユーザー/ユーザー/ライブラリ/ Developer/Xcode/DerivedData/My.Project-fntdulwpbhbbzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug -iphonesimulator/My.Project.build/DerivedSources
世話をする、
ジョン
プロジェクトにはスペースを含まないモジュール名が必要です。 [定義] [ビルド設定]の[パッケージ]で、[モジュール]を[はい]に設定する必要があります。 #importステートメントをコメントアウトしました。
それでも「ProductModuleName-Swift.h」のインポートにエラーがある場合
//#import "ProductModuleName-Swift.h"
私のSwiftコードには他にもたくさんのエラーがあることがわかりました。
これらの新しいエラーを修正してソースの構築に成功したら、#importとbingoのコメントを外しました。ヘッダーが作成され、正しくインポートされました:)
プロジェクト内の実際のファイルは作成されません([ProductModuleName] -Swift.h)。 Cmd +インポートをクリックすると、それがオンザフライで(そしてメモリ内で)生成されるので、リンケージがどのように行われているかを見ることができます。
モジュールの定義プロジェクトターゲット(ターゲットのビルド設定)をはいに設定する必要があります。モジュール名にスペースまたはダッシュが含まれる場合 - [ProductModuleName]のすべてのインポートで_を使用-Swift.hファイル.
Swiftタイプを使用するすべての.hファイルと.mファイルにインポートすることも、.pchにインポートすることもできます。
だから私のモジュール(プロジェクト)が "Test Project"という名前であれば、私は自分のプロジェクトの.pchファイル(ちょうどそこにある)にこれをインポートするでしょう:
#import "Test_Project-Swift.h"
私はいつも私に効くトリックを見つけました。
このエラーを受け取るたびに、この作業(appDelegate.hファイルから "ProductModuleName-Swift.h"を削除して作成し、コードを削除してください)を行ってください。
私の場合は、展開ターゲットを少なくとも「OS X 10.9」に設定する必要があり、-Swift.h
ヘッダーが自動的に生成されました。デプロイメントターゲットのバージョンを変更すると、特に古くて非常に大きなObjective Cコードベースがある場合は、多くの非推奨警告が表示される可能性があります。私たちの場合は、XIBファイルとビュークラスでやるべきことがたくさんありました。
私はモジュール名/ Objective-CによるSwiftのヘッダーのインポートを決定するのに苦労していました。私もここでたくさんの記事を読みました。
しかし、あなたのプロジェクト名に含まれているすべての特殊文字(それは '。'でも数字でもスペースでも)の決定的な答え - あなたは "Product Moduleであなたに役立つテキストを見つけることができます。ターゲットのビルド設定の下の名前」。
例えば、私のターゲット名は数値 "1mg"で始まり、上記のフィールドは私のモジュール名として "_mg"を示していました。
だから私は#import "_mg-Swift.h"を使ってそれはうまくいった。
私はこの解決策を見つけました
今すぐすることができます
#import "SwiftBridge.h"
productModuleName-Swift.hの代わりに
これは次善策の解決策です、Xcodeの次のバージョンのために私はこの問題が解決されると思います。がんばろう
Cocoapodなどを使用している場合(およびプロジェクトではなくワークスペースから作業する場合)、ワークスペースを開いてビルドする前に、プロジェクトを開いてビルドしてみてください。 YMMV.
Objective CプロジェクトからWatchOS2 Swiftコードを削除しなければなりませんでした。そしてそのXCodeが-Swift.hを生成することを申し出た後に初めて
ファイルは生成されていましたが、XCodeがそれを見つけることができませんでした(Lou Zellの答えを使って生成されたことを証明しました)。
これはObjCとSwiftが混在するフレームワークに対する私の修正(Xcode 9.2)です。
最初の2つのステップはあなたがあなたのプロジェクトをうまく構築し使用することを可能にするべきですが、最後の2つはそれが他のコンピュータ上で動作することを可能にします(すなわちそれはチームプロジェクトで共同作業をするときまだ動作します)。
これは明白なポイントかもしれませんが(多すぎるのは明白かもしれません)、ヘッダーを生成するには、プロジェクトに少なくとも1つのSwiftファイルが必要です。後でSwiftを書くつもりで定型コードや設定コードを書いている場合、インポートは機能しません。
私は同じような問題を抱えていましたが、私のプロジェクトは以前にコンパイルされていました、そして少しのファイルコード変更の後突然エラーになりました。 myproject-Swift.hファイルに「ファイルが見つかりません」というエラーが表示されるのはなぜかを突き止めるのに時間がかかりました。私が行ったコードの変更にはいくつかエラーがありました。 Xcodeは、「ファイルが見つかりません」というエラーを表示する代わりに、これらのエラーを表示しませんでした。それから以前のバージョンのコードのコピーを入手し、私は新しいコードと比較してファイルを一つずつマージしました。各ファイルマージの後で、エラーを見つけるためにプロジェクトを順守しました。つまり、あなたのコードにエラーがあるなら、Xcodeはmyproject-Swift.hファイルに対して 'file not found error'を表示するだけかもしれません。おそらくあなたのプロジェクトでコンパイルエラーがあります。それらのエラーをきれいにすればうまくいくでしょう。
場合によっては、obj-c .mファイルのターゲットメンバーシップを設定解除してから再度設定する必要があります。
“ProductModuleName-Swift.h” not found
エラーに関連する問題がなく、以前にプロジェクトを構築できた場合、その厄介なエラーが再び発生するようになった場合、その理由は最近の変更にある可能性があります。
私にとっては、これは(偶然の)誤った.Swift
ファイルエンコーディングによるものです。変更を元に戻して手動で元に戻すことで仕事ができます。