web-dev-qa-db-ja.com

Xcode 6で作成されていないObjective-CヘッダへのSwift

私は最近、Swiftを既存のプロジェクトに追加して、実際の方法で試してみることに取り組んでいます。

プロジェクトにSwiftのソースファイルを追加しても、 "Bridging Header"(つまりObjective-CからSwiftへ)を取得するのに問題はありません。

しかし、Swiftクラスを*-Swift.hとマークするか、またはObjCクラスのサブクラスとして公開することになっている@objcヘッダーファイルは、 どこにも 見つけられる :-(

Swiftで書かれた私の新しいサブクラスの使用方法を達成するための具体的な手順は、メインのアプリケーションコード(まだObjective-Cです)にはありません。

私が開発をリードしているアプリはかなり大きなコードベース(70.000行)を持っているので、一度にそれを移行することは問題外です。

237

今それは働きます。

  1. プロジェクトには、notを含む製品モジュール名が必要です。
  2. 定義モジュールは、[パッケージ]の下の[ビルド設定]でYesに設定する必要があります。

最後に動作します。助けてくれてありがとう:-)

161

私は同様の問題を抱えていたし、あなたが追加することができることがわかった

#import “ProductModuleName-Swift.h”

アンブレラヘッダーを見つけるための.hファイルではなく、obj-c .mファイルへ

122
macduff

ファイルを生成する前にallビルドエラーを修正する必要があることがわかりました。

私にとっての問題は、それがchicken/Eggの問題であるということでした。実際に#importステートメントをコメントアウトするまで、ビルドエラーが発生しなかったことです。

//#import "ProductModuleName-Swift.h"

私のSwiftコードには他にもたくさんのエラーがあることがわかりました。

これらの新しいエラーを修正してソースの構築に成功したら、#importとbingoのコメントを外します。ヘッダーが作成され、正しくインポートされました:)

56
petehare

私のような人なら、おそらくヘッダー名が間違っているでしょう。しばらく頭をぶつけた後、DerivedDataでファイルを探しました。私の設定では(標準の派生データフォルダを使用しています)、

cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'

それを見つけるでしょう。そのフォルダ内に何も一致しない場合、Xcodeはそれを生成していません。

Xcode Version 6.2(6C86e)を使用しています

42
Lou Zell

プロジェクトモジュール名にスペースが含まれる場合は、必須スペースをアンダースコアに置き換えます。

たとえば、プロジェクト名が "My Project"の場合は、次のようにします。

#import "My_Project-Swift.h"

42
JohnMorrison

*唯一の重要なことは:*

ターゲットで定義済みの「製品モジュール名」を使用し、その後に-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属性でタグ付けされる必要がありますココア ...

31
Luc-Olivier

私があなたがこれに関して問題を見つけるかもしれないもう一つの理由を加えたいと思いました - 私はSwiftとObjective-Cコードを混合したフレームワークを作成していました。 Swiftクラスをフレームワークの外にインポートすることができませんでした - -Swift.hファイルを確認しましたが、生成中でしたが空でした。

問題は非常に、非常に単純であることがわかった - 私は私のSwiftクラスのどれも公に宣言していなかった! publicキーワードをクラスに追加するとすぐに、フレームワークの内側と外側のクラスからそれらを使用することができました。

また、フレームワークの内側(別の回答で言及されているように、.mファイルの内側のみ)に注意してください。-Swift.hファイルを次のようにインポートする必要がありました。

#import <FrameworkName/FrameworkName-Swift.h>

私は同じ問題を抱えていました。あなたは設定を調整しなければならないようです(モジュールと製品モジュール名を定義します)前にあなたはあなたの最初のSwiftファイルを追加します。

後で実行すると、さらにSwiftファイルを追加したり、Swiftファイルを削除して新しいファイルを作成した場合でも、このプロジェクト用の "* -Swift.h"ファイルは生成されません。

14
user3540830

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"

プロジェクトのデータをチャート化するモジュールへ。

12
gjpc

ファイル名の前には必ずTargetという名前が付きます。これは製品名と呼ばれますが、実際にはターゲット名です。ですから、新しいターゲット用にビルドしたい場合は、that_target-Swift.hファイルを用意する必要があります。

これを処理する1つの方法は

  1. ターゲット自体の名前(スペースなし)であるターゲットごとにプリプロセッサを追加します。例MY_TARGET=1。各ターゲットのプロジェクト設定 - >ビルド設定 - >プリプロセッサマクロでこれを追加します。
  2. PCHファイルを使用している場合

これらの行をPCHファイルに追加してください。

#if MY_TARGET==1
#include "My_Target-Swift.h"
#Elif THAT_TARGET==1
#include "That_Target-Swift.h" 
#endif

PCHファイルを使用する利点は、どこにでもヘッダーを含める必要がないということです。

  1. PCHファイルを使用していない場合は、これらの同じ行を単一のヘッダーに追加し、Swiftクラスを使用する必要がある場所にそのヘッダーを含めてください。

これはうまくいくはずです。

12
Deepak G M

Swiftを古いobjcプロジェクトで使用しようとした私の経験を共有できるようにします。 Defines moduleYESに設定する必要はありませんでした。

私の場合、私は手動でobjc Bridging Headerがあることを確認する必要がありました。生成されたインタフェースヘッダ名だけが私のビルド設定に存在していました。

Missing bridging header

これにより、MyApp-Swift.hファイルが生成されますが、私のSwiftクラスの痕跡は残りません。

Appleのドキュメントには、最初のSwiftファイルを追加するときにブリッジングヘッダを作成するように促されると書かれています。そうではありません。手動でMyApp-Bridging-header.hファイルを追加し、それを「Objective-C Bridging Header」フィールドで参照しました。これにより、MyApp-Swift.hファイルにSwiftクラスが追加されました。

ドキュメント: Objective-CへのSwiftのインポート

11
Nicolai Dahl

XCodeが実際に-Swift.hヘッダーを(DerivedDataの奥深くに)生成しているが、それがSwiftクラスを参照していない場合は、必ずブリッジヘッダーも定義してください。ドキュメントの読み方は、SwiftからObjective-Cを呼び出すために必要なことだけを示唆していましたが、Objective-CからSwiftを呼び出すためにも必要なようです。

私の答えを参照してください。 https://stackoverflow.com/a/27972946/337392

編集:私は最終的にアップルのドキュメントで説明されて見つけたように、それは公共の対内部のアクセス修飾子のためです: -

デフォルトでは、生成されたヘッダはpublic修飾子でマークされたSwift宣言のためのインタフェースを含みます。アプリターゲットにObjective-Cブリッジングヘッダーがある場合は、内部修飾子でマークされたものも含まれます。

10
Echelon

多くの人がここで持っていることを第二に、適切なスクリーンショットを追加すること。 SwiftとObj-Cコードは確かに共存できます。それは全然か無ゲームではない。

Objective-CのSwiftファイルにアクセスするには、(。m/implementationファイルの)Obj-Cファイルにこの呼び出しを追加するだけです。

#import "{product_module_name}-Swift.h"

({product_module_name}はプロジェクトの製品モジュール名を表します)。製品モジュール名を推測したり、スペースや特殊文字を使用してコーナーケースを見つけ出したりするのではなく、プロジェクトの[ビルド設定]タブに移動して「製品モジュール名」と入力するだけです。私のものは私が期待していなかったものでした。混乱しているならこのスクリーンショットをチェックしてください。

enter image description here

そして、Obj-cコードをSwiftで動作させるためには、ブリッジングヘッダファイルを追加し、そこに関連するObj-Cヘッダをインポートするだけです。

7
Brian Sachetta

さて、ここにあなたが本当に必要とするすべてのものがあります!

1.追加したSwiftファイルをすべて削除し、コードをコンパイルします。エラーはありません。

----------

enter image description here

----------

2. [プロジェクト]ビルド設定に移動し、製品モジュール名を設定します。プロジェクトには、スペースを含まない製品モジュール名を付ける必要があります。

----------

enter image description here

----------

3.プロジェクトの[ビルド設定]の[パッケージ]の下で、[ターゲット]ではなく[定義モジュール]を[はい]に設定する必要があります

----------

enter image description here

----------

4.ファイル - > newFile - >で、SwiftファイルまたはView Controllerを作成します。

----------

enter image description here

----------

それはそれを作ることができるように、ブリッジングヘッダを作成するように要求します。一度拒否した場合は、手動で-Bridging-Header.hを追加する必要があります。

5.コントローラに@objcを追加して、ObjectiveCに公開する必要があるSwiftファイルがいくつかあることをコンパイラに伝えます

----------

enter image description here

----------

6.プロジェクトをビルドして、#import "-Swift.h"をいずれかのObjective-Cコントローラにインポートすれば、うまくいきます。実際のファイルを見るためにそれをCommand-クリックすることができます!

----------

enter image description here

----------

お役に立てれば!

5
Kakshil Shah

この答えは、Swiftクラスを呼び出すObjective-Cコードをすでに持っていて、このエラーを受け取り始めるというユースケースに対処します。

問題の修正方法

以下のステップは、最終的に私にとってすべての問題を解決しました。私は、「鶏と卵」について言及している人を上に読みましたが、それがまさにその概念であり、私がこの手順を導いたのです。この明示的なプロセスは、ヘッダーが生成されるまでSwiftクラスを参照しているObjective-Cコードを削除する必要があることを示しています。

  1. Objective-C実装ファイルの#import "ProductModuleName-Swift.h"ステートメントをコメントアウトします。
  2. Objective-C実装ファイル内のSwift Classesへの参照をコメントアウトします。
  3. クリーン&ビルド
  4. すべてのエラー/警告を解決する
  5. #import "ProductModuleName-Swift.h"ステートメントのコメントを削除します。
  6. クリーンアップしてビルド(正常にまたは残りのエラーを修正し、この時点でObjective-CのSwiftクラスを参照していないことを確認します。これらの)
  7. "ProductModuleName-Swift.h"ステートメントが#import "ProductModuleName-Swift.h"ステートメントのクラス名でCmdクリックされていることを確認します。
  8. Objective-Cの実装ファイルでSwiftクラスを参照するコードのコメントを削除します。
  9. 通常どおりにクリーンアップしてビルドします( "ProductModuleName-Swift.h"が生成され、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ファイルは再び自動生成されました。

build-settings

4
Tommie C.

最も重要なことはこのファイルは見えない!!!少なくともXcode 6 beta 5にあるということです。あなたのワークスペースには、 "YourModule-Swift.h"という名前のファイルはありません。モジュール名があり、moduleをyesに設定していることを確認し、それをObjective-Cクラスで使用してください。

4
user412759

Objective-Cクラスにヘッダーをインポートする必要があります。

#import “ProductModuleName-Swift.h”

自動的に生成され、「ターゲットのSwiftファイルはすべてこのimport文を含むObjective-Cの.mファイルに表示されます」との言及に基づいています。

3
Anton

"。"を使った人なら誰でも頭が上がります。そこにプロジェクト名。 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

世話をする、

ジョン

2
jonthornham

プロジェクトにはスペースを含まないモジュール名が必要です。 [定義] [ビルド設定]の[パッケージ]で、[モジュール]を[はい]に設定する必要があります。 #importステートメントをコメントアウトしました。

それでも「ProductModuleName-Swift.h」のインポートにエラーがある場合

//#import "ProductModuleName-Swift.h"

私のSwiftコードには他にもたくさんのエラーがあることがわかりました。

これらの新しいエラーを修正してソースの構築に成功したら、#importとbingoのコメントを外しました。ヘッダーが作成され、正しくインポートされました:)

2
j.krissa

プロジェクト内の実際のファイルは作成されません([ProductModuleName] -Swift.h)。 Cmd +インポートをクリックすると、それがオンザフライで(そしてメモリ内で)生成されるので、リンケージがどのように行われているかを見ることができます。

モジュールの定義プロジェクトターゲット(ターゲットのビルド設定)をはいに設定する必要があります。モジュール名にスペースまたはダッシュが含まれる場合 - [ProductModuleName]のすべてのインポートで_を使用-Swift.hファイル.

Swiftタイプを使用するすべての.hファイルと.mファイルにインポートすることも、.pchにインポートすることもできます。

だから私のモジュール(プロジェクト)が "Test Project"という名前であれば、私は自分のプロジェクトの.pchファイル(ちょうどそこにある)にこれをインポートするでしょう:

#import "Test_Project-Swift.h"
2
Nikolay Tsenkov

私はいつも私に効くトリックを見つけました。

  1. AppDelegate.hファイルとProductName-Prefix.pchファイルに#import "ProductModuleName-Swift.h"を作成します。あなたがxcode 6でそれを持っていないなら、あなたはこの方法でそれを作ることができます なぜProjectName-Prefix.pchはXcode 6で自動的に作られないのですか?
  2. あなたの "ProductModuleName-Swift.h"についてのエラーを受け取った場合は、appDelegate.hファイルからそれを削除してください。
  3. コードをもう一度きれいにしてください。今、すべてが魅力のように機能します
  4. 「ProductModuleName-Swift.h」に関するエラーが再度表示される場合は、appDelegate.hファイルにもう一度作成してコードをもう一度クリーンアップします。

このエラーを受け取るたびに、この作業(appDelegate.hファイルから "ProductModuleName-Swift.h"を削除して作成し、コードを削除してください)を行ってください。

1
yannisalexiou

私の場合は、展開ターゲットを少なくとも「OS X 10.9」に設定する必要があり、-Swift.hヘッダーが自動的に生成されました。デプロイメントターゲットのバージョンを変更すると、特に古くて非常に大きなObjective Cコードベースがある場合は、多くの非推奨警告が表示される可能性があります。私たちの場合は、XIBファイルとビュークラスでやるべきことがたくさんありました。

1

私はモジュール名/ Objective-CによるSwiftのヘッダーのインポートを決定するのに苦労していました。私もここでたくさんの記事を読みました。

しかし、あなたのプロジェクト名に含まれているすべての特殊文字(それは '。'でも数字でもスペースでも)の決定的な答え - あなたは "Product Moduleであなたに役立つテキストを見つけることができます。ターゲットのビルド設定の下の名前」。

例えば、私のターゲット名は数値 "1mg"で始まり、上記のフィールドは私のモジュール名として "_mg"を示していました。

だから私は#import "_mg-Swift.h"を使ってそれはうまくいった。

Product Module Name in the build settings of target gives the correct module name which will work for your project

1
Keroberos

私はこの解決策を見つけました

  • SwiftBridge.hを作成します。
  • #import“ ProductModuleName-Swift.h”を追加してください。
  • この.hファイルを公開する(重要)ファイルを選択します - >表示ファイルインスペクタを表示(右) - >公開する

今すぐすることができます

#import "SwiftBridge.h"

productModuleName-Swift.hの代わりに

これは次善策の解決策です、Xcodeの次のバージョンのために私はこの問題が解決されると思います。がんばろう

1
Tot FOURLEAF

Cocoapodなどを使用している場合(およびプロジェクトではなくワークスペースから作業する場合)、ワークスペースを開いてビルドする前に、プロジェクトを開いてビルドしてみてください。 YMMV.

0
Warpling

Objective CプロジェクトからWatchOS2 Swiftコードを削除しなければなりませんでした。そしてそのXCodeが-Swift.hを生成することを申し出た後に初めて

0
Andrew Marin

ファイルは生成されていましたが、XCodeがそれを見つけることができませんでした(Lou Zellの答えを使って生成されたことを証明しました)。

これはObjCとSwiftが混在するフレームワークに対する私の修正(Xcode 9.2)です。

  1. Finder(TargetName-Swift.h)で検索して、DerivedDataで生成されると思われるファイルを見つけます。
  2. XCodeでプロジェクトにドラッグし、UNCHECKファイルをコピーします。
  3. XCodeでファイルをクリックしてファイルインスペクタ(右側パネルの最初のタブ)を開きます。
  4. 場所グループに対する相対から製品に対する相対的な相対位置に変更

最初の2つのステップはあなたがあなたのプロジェクトをうまく構築し使用することを可能にするべきですが、最後の2つはそれが他のコンピュータ上で動作することを可能にします(すなわちそれはチームプロジェクトで共同作業をするときまだ動作します)。

0
rmooney

これは明白なポイントかもしれませんが(多すぎるのは明白かもしれません)、ヘッダーを生成するには、プロジェクトに少なくとも1つのSwiftファイルが必要です。後でSwiftを書くつもりで定型コードや設定コードを書いている場合、インポートは機能しません。

0
Alex Brown

私は同じような問題を抱えていましたが、私のプロジェクトは以前にコンパイルされていました、そして少しのファイルコード変更の後突然エラーになりました。 myproject-Swift.hファイルに「ファイルが見つかりません」というエラーが表示されるのはなぜかを突き止めるのに時間がかかりました。私が行ったコードの変更にはいくつかエラーがありました。 Xcodeは、「ファイルが見つかりません」というエラーを表示する代わりに、これらのエラーを表示しませんでした。それから以前のバージョンのコードのコピーを入手し、私は新しいコードと比較してファイルを一つずつマージしました。各ファイルマージの後で、エラーを見つけるためにプロジェクトを順守しました。つまり、あなたのコードにエラーがあるなら、Xcodeはmyproject-Swift.hファイルに対して 'file not found error'を表示するだけかもしれません。おそらくあなたのプロジェクトでコンパイルエラーがあります。それらのエラーをきれいにすればうまくいくでしょう。

0
Ram G.

場合によっては、obj-c .mファイルのターゲットメンバーシップを設定解除してから再度設定する必要があります。

0
valeCocoa

“ProductModuleName-Swift.h” not foundエラーに関連する問題がなく、以前にプロジェクトを構築できた場合、その厄介なエラーが再び発生するようになった場合、その理由は最近の変更にある可能性があります。

私にとっては、これは(偶然の)誤った.Swiftファイルエンコーディングによるものです。変更を元に戻して手動で元に戻すことで仕事ができます。

0
Yevhen Dubinin