Project-Swift.hをObjective-Cクラスにインポートしています…ファイルが見つかりません


128

Objective-Cで開始されたプロジェクトがあり、以前にObjective-Cで記述したのと同じクラスファイルにSwiftコードをインポートしようとしています。

私はアップルの相談ていないドキュメントを同じプロジェクトのほか、SOの中でスウィフトとObjective-Cを使用して、質問のような、まだ無駄:私はに入れた後、エラーが見つかりませんファイルを取得し続ける#import "NewTestApp-Swift.h"NewTestApp製品の名前です。およびモジュール)。

これが私がこれまでに行ったことです:

  1. ではDefine ModulesYESアプリ用に選択されています。
  2. 製品モジュール名にスペースが含まれていないことを確認しました(質問の下のスクリーンショットを参照)

私が使って試してみました#import "NewTestApp-Swift.h"内部をViewController.mViewController.hそしてAppDelegate.mそれらのどれも働いていません。

他に何を間違っていますか?ご協力いただきありがとうございます。


設定のスクリーンショット:

ここに画像の説明を入力してください


現在発生しているエラー:

ここに画像の説明を入力してください


3
すべての派生データを削除するのは~/Library/Developer/Xcode/DerivedData私にとってはトリックでした。
wzhang84 2016年

これが私が問題を解決した方法です:stackoverflow.com/a/45338549/8102549
schrulnz '26 / 07/26

回答:


158

私は同じ問題に遭遇していて、プロジェクトがobj-cクラスに迅速にインポートすることができませんでした。Xcode 6(Xcode 6+で動作するはずです)を使用して、この方法でそれを行うことができました...

  1. .hファイルでアクセスする必要があるクラスは、次のように前方宣言である必要があります

@class MySwiftClass;

  1. .mファイルのみで、コードが同じプロジェクト(モジュール)にある場合は、次のコマンドでインポートする必要があります。

#import "ProductModuleName-Swift.h"

それに関するアップルのドキュメントへのリンク

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c


3
答えてくれてありがとう。それが私を正しい方向に導きました。私は同じ問題を抱えていましたが、プロトコルを使用していたため、ヘッダーファイルにインポートの代わりに@protocol MySwiftProtocolを追加する必要がありました。
パルメ2017年

.hファイルで、.hファイルを要求せずにクラスの前方宣言を行うとうまくいきました。ありがとう
Sikander

1
製品名に-文字が含まれている場合、生成されたヘッダーファイルの名前はに変換され_ます。たとえば、製品名がの場合、My-AppインポートしMy_App-Swift.hます。
dvanoni

1
生成された正しいヘッダーファイル名を見つける新しい方法を見つけました。ターゲットに移動します->ビルド設定->キーワード検索Objective-C Generated Interface Header Name、ビンゴ!
イタチ

2
私はこれらの両方を実行しましたが、それでも同じ問題が発生しています。注文と関係があると思いますか?
ArielSD

83

Swiftコードがモジュール内にある場合(あなたの場合のように):

#import <ProductName/ProductModuleName-Swift.h>

Swiftコードがプロジェクト内にある場合(SwiftとObjCが混在):

#import <ProductModuleName-Swift.h>

あなたの場合、*。mファイルに次の行を追加する必要があります。

#import <NewTestApp/NewTestApp-Swift.h>

重要:インポートステートメントの「<」を見てください

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html


@ ikocel1に答えてくれてありがとう。残念ながら、これらは機能しませんでした。私はのバリエーションを試してみた<NewTestApp-Swift/NewTestApp-Swift.h><NewTestApp/NewTestApp-Swift.h><NewTestApp/ViewController-Swift.h>すべての内部ViewController.mが、にも関わらず、エラー「ファイルが見つかりません」を取得し続けるCleaningの組み合わせを試した後、プロジェクトごとに。役立つ場合に備えて、質問の本文にスクリーンショットを含めました。
ダスピアニスト、2014年

まだSwiftコードをまだ入力していませんViewController.m。私は、最初にヘッダーをインポートして、それがSwiftコードを受け入れるようにしようとしているだけです。私はObjective-CとSwiftの両方のコードを組み合わせて使用​​しViewController.mます。
ダスピアニスト、2014年

1
同じファイルに直接objcコードと迅速なコードを混在させることが可能かどうかはわかりません。
ikocel1 2014年

1
おかげで、これは私がAppleの「Mix and Match」ドキュメントに基づいたものだと思いましたが、実際のファイル内ではないと思います。ありがとうございました!
ダスピアニスト、2014年

6
この回答が承認された理由がわかりませんでした。はい、ドキュメントに従っていますが、私にとっても実際には機能しません。質問でも、ユーザーがこの回答で推奨されている構文を使用していることは明らかですが、それでもエラーが発生します。
Darius Miliauskas 2015年

54

Swiftをobjective-cにインポートする方法:

  • YESに設定されたモジュールを定義します(プロジェクトではなくターゲット上)
  • 製品モジュール名セット(プロジェクトではなくターゲット上)
  • ViewController.mで、次のコードを使用して迅速なコードをインポートします。

    #import "MyProductModuleName-Swift.h"
  • (スウィフト> - - >新規ファイル)と、あなたのObjective-Cのプロジェクトに迅速にファイルを追加しますXcodeの橋渡しヘッダを作成する Objective-Cのからスウィフトにこれは非常に重要です、それはあまりにも周りの他の方法を回避させるための-明らかに。

このパズルの最後のピースは、既存のswiftファイルをプロジェクトにドラッグアンドドロップするのではなく、実際にXcode GUIを介してSwiftファイルを追加することを認識させてくれたSwiftoverloadのおかげです。http//nikolakirev.com/blog / using-swift-in-objective-c-project


素晴らしいメモ。テストターゲットは独自のモジュールであり、 "<#TestTargetName#>-Swift.h"という名前の独自のヘッダーがあり、ターゲット名のスペースはすべてスペースに変換されることを追加します。
チャック・クルツィンガー、

@ holm51これを聞いてすみませんが、どこにDefine ModuleありProduct Module Nameますか?
matchifang

-名前のダッシュ_もアンダースコアに変換されます
Cyber​​Mew

11

Xcodeの8.2.1を使用して、あなたが見れば、プロジェクト ]> [ビルド設定>はObjective-Cの生成するインターフェイスヘッダー名、それはそこに示し一つだけのような名前のヘッダファイル製品を -Swift.hを

つまり、個々の-Swift.hファイルを使用して、Objective-C .mファイルから各モジュールを個別にインポートする代わりに、すべてのSwiftモジュールを集約した1つのProduct -Swift.hをインポートするだけです。

モジュールを個別にインポートする従来の方法を探すことで同じ問題が発生しましたが、XcodeとSwift 3の現在のバージョンでは、すべてのモジュールのインポートで1つのヘッダーのみを使用するように変更されました。


こんにちは、このファイルはどこにありますか?それともxcodeによって自動生成されますか?また、この変更により、podfileを別の方法でセットアップする必要がありますか?
Rob Norback 2017年

@RobNorback私が間違っていない場合は、Obj-Cヘッダー/実装ファイルに「import "Product-Swift.h"」と書くだけで、追加の処理を行わずに効果を確認できます。プロジェクトの設定で、SwiftとObj-Cの混合に対してすべての構成が有効になっていることを確認してください。また、私はまだPodfileで問題を経験していません。見方が違う場合はお知らせください。
petershine 2017

ありがとう、私はこれをデバッグするために何時間も費やしました、そして実際問題は私のプロジェクトの各モジュールが独自の-Swift.hヘッダーファイルを生成していたことでした。それらすべて(5つのターゲットがあります)に共通のヘッダーファイルを使用するように強制すると、問題が解決しました。
Apoorv Khatreja 2017年

@ApoorvKhatrejaどのようにして彼らにそれを強制したのですか?ファイル名を明示的に書きましたか?
Amit Raz

8

この問題に1時間費やしました。次の手順に従うと、不足しているものを理解するのに役立ちます。

  1. Xcode設定を開き、DerivedDataフォルダーに移動します
  2. 検索で「swift.h」を検索
  3. project-swift.hファイルが見つからない場合、このファイルは生成されていません。通常、@ objcを迅速なクラスの1つに追加してアプリを正常にビルドする必要があります。その後、Xcodeでこのファイルを生成します
  4. 「xxx-swift.h」ファイルが見つかった場合は、インポートステートメントに正しい名前が含まれていることを確認してください。

How-to-locate-swift-file


複数の質問に同じ回答を追加しないでください。十分な評判を得たら、最高の1つに答え、残りを重複としてフラグを立てます。重複していない場合は、質問に合わせて投稿を調整し、削除のフラグを立てます。
Bhargav Rao

これありがとう!アプリの表示名(ターゲットではありません)を変更し、Swiftヘッダーの名前も変更しました。これが私が起こっていることを見つけることができる唯一の方法でした。
Lucas P.

回答を投稿していただきありがとうございます。スクリーンショットと正確なポイントフォームにより、すぐにスクロールして戻る+見た+検索を終了しました...問題は解決しました!
dklt

6

SwiftをObjective-Cプロジェクトにインポートするときに問題が発生しました。最後に、派生データフォルダーを調べて、Xcode 7が何を生成しているかを確認しました。ファイル名は私が期待していたものとは完全に異なっていました。

実際のファイル名がわかったら、それをインポートしてプロジェクトをビルドできます。


2
このファイルはどこにありますか?私はそこを
Amit Raz

5

-Swift.hSwiftコードが@objcまたはを介してAPIを公開する場合は、Xcodeによって自動的に作成されます。@objcMembers [About]

通常、場所は次のようになります

~/Library/Developer/Xcode/DerivedData/
  ProductModuleName-foo/
    Build/
      Intermediates.noindex/
        ProductModuleName.build/
          Debug-iphoneos/
            ProductModuleName.build/
              DerivedSources/
                ProductModuleName-Swift.h

それはによって変えることができます

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

デフォルトでは、値は $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)


2

モジュールの定義:はい、「ProjectName-Swift.h」をObj-Cクラスの.mファイルにインポートします

これは、Obj-cのSwiftクラスにアクセスするのに役立ちました。


3
しかし、objcヘッダーに迅速なクラスが必要な場合、それを.hファイルにインポートするにはどうすればよいですか?
Alexander Danilov

1

gitを使用してプロジェクトに取り組んでいたとき、私のチームと同じ問題に直面していました。ある開発者は、Xcodeを最新のSwift 2.2バージョンに必要な最新バージョン(7.3)に更新していません。そのため、コンパイラは新しいSwift構文を認識しておらず、Swiftライブラリ(projectname-swift.h)のインターフェイスを生成できませんでした。Xcodeのバージョンが最新かどうかを確認してください。


私の場合、Xcodeが提供するSwift 3への移行を延期することにしたため、問題に直面しました。その結果、XcodeはSwiftソースファイルを構築できず、含めるヘッダーを生成できませんでした。
iutinvg

1

開発中に、いくつかの構文エラーが発生する可能性があるため、完全に実装されていない迅速なクラスが存在する可能性があります。すべてのSwiftファイルにエラーがない場合にのみ、Swiftヘッダーファイルを使用できます。

Swiftファイルに構文エラーがないことを確認してから、SwiftヘッダーをObjective-Cファイルにインポートしてみてください


1

ヘッダーファイルのインポート、つまり

#import "<ProjectName>-Swift.h" 

.hファイル内で次のエラーが発生しました:

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

ビルドは失敗しました。

代わりに:

#import "<ProjectName>-Swift.h"

.mファイル内で、同じエラーが表示されても、プロジェクトを実行するとエラーが抑制されます。

その後、Swiftクラスは.mファイル内で使用できます。


1

プロジェクト(ターゲット)の名前の問題に直面しました。記号「-」が含まれています。したがって、決定は次のとおりでした。プロジェクトの名前が「Test-App」の場合、インポートされたクラスの名前は「Test_App-Swift.h」です。


優れたソリューション
iOS Lifee

1

アプリ名に特殊文字が含まれている場合は、特殊文字に_を使用します。

たとえば、アプリ名が「TestApp®」という名前の場合

次に、「Test_App_-Swift.h」でswiftファイルをインポートできます。

スペースと®は、インポート中に_に置き換えられます。


0

複数のターゲットがある場合は、すべてのフレームワークをビルドしていることを確認してください


0

Xcode 11

Xcode 11でビルドするときにこの問題に遭遇しました。何が問題かを理解するために少し時間をかけましたが、基本的には、 Info.plist、ターゲットの「情報」タブ。

その結果、Xcode 11.5は一連の新しいカスタムビルド設定を書き換え/作成し、アプリモジュールとビルドされた.app製品の名前を変更しました。この場合、新しい表示名にもフォワードスラッシュ(/)文字が含まれていたため、最終的にはビルドされなかったのかもしれません(@Silversky Technology回答を参照)。

いずれにしても、プロジェクトファイルに対するXcode 11.5の自動変更をすべて元に戻し、バンドルの表示名に同じ変更を手動で加えることで、これを解決しました。 Info.plistファイル、すべてが完全に機能しました。

私はそれがちょうど前にこのようなことをしていて、あなたの同意なしにそれをしたことをあなたに教えてくれるといいのですが。


0

Swiftクラスにpublic宣言があり、NSObjectを拡張していることを確認してください:

public class MySwiftClass: NSObject {
    //...
}

Swiftクラスが同じプロジェクトにある場合、インポートは括弧ではなく引用符で動作するはずです。


0

最初にSwiftファイルを追加する場合、ターゲットにSwiftファイルを追加するように注意してください...、左の列に

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.