SwiftコードをObjective-Cにインポートするにはどうすればよいですか?


281

私はSwiftでライブラリを作成しましたが、Objective-Cで作成した現在のプロジェクトにインポートできませんでした。

それをインポートする方法はありますか?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

9
このプロジェクトが大好きです!
SleepsOnNewspapers 2015

回答:


430

インポートする必要がありTargetName-Swift.hます。それがターゲット名であることに注意してください-他の答えはクラス名の使い方を間違えます。

この単一のファイルは自動生成ヘッダーであり、アノテーションが付けられているか@objc、から継承されている、プロジェクト内のすべてのSwiftクラスのObjective-Cインターフェースを定義しますNSObject

考慮事項:

  • あなたのターゲット名にスペースが含まれている場合は、(例えばアンダースコアに置き換えるMy ProjectとなりMy_Project-Swift.h

  • ターゲットがフレームワークの場合、インポートする必要があります <TargetName/TargetName-Swift.h>

  • Swiftファイルがターゲットのメンバーであることを確認してください


5
インポートでSwiftファイル名を使用しようとすると、「予期された ';」というエラーが表示されることに注意してください。トップレベルの宣言子の後」。「インポートファンデーション」の後のSwiftファイル内。
louielouie 14年

8
編集:注:これを機能させるには、プロジェクトモジュール名を定義する必要があります。参照:stackoverflow.com/a/24064015/2085743
Ruben Martinez Jr.

7
プロジェクト名に空白や特殊文字が含まれている場合、「My App」は「My_App-Swift.h」のようにアンダースコアに置き換える必要があるというメモを追加したいと思います
Hola Soy Edu Feliz Navidad

84
なぜこれがそれほど難しく、文書化が不十分なのですか?
uchuugaka 2015年

3
@leleloいいえ、そのファイルはこのファイルの反対です。ブリッジヘッダーは開発者によって記述され、Objective-CおよびCのシンボルをSwiftコードに組み込むことができます。Target-Swift.hファイルが自動的に生成され、Objective-C / CコードがSwiftシンボルにアクセスできるようになります。
ビル

154

アップルのウェブサイトからの指示:

同じフレームワークからObjective-CにSwiftコードをインポートするには

下にビルド設定梱包、確認してください定義モジュール そのフレームワーク目標の設定に設定されてはい。この構文を使用し、適切な名前に置き換えて、そのフレームワークターゲットからそのフレームワークターゲット内のObjective-C .mファイルにSwiftコードをインポートします。

#import "ProductName-Swift.h"

リビジョン:

.mファイルの「ProductName-Swift.h」のみをインポートできます。

ターゲットのSwiftファイルは、このインポートステートメントを含むObjective-C .mファイルに表示されます。

循環参照を避けるために、SwiftをObjective-Cヘッダーファイルにインポートしないでください。代わりに、Swiftクラスを転送宣言してObjective-Cヘッダーで使用できます。Objective-CではSwiftクラスをサブクラス化できないことに注意してください。

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


2
.mファイルの "ProductName-Swift.h"のみをインポートすることが役に立ちました。同じことを.pchファイルに追加すると、「 'CLLocationManagerDelegate'のプロトコル宣言が見つかりません。'NSLayoutManagerDelegate 'を意味していましたか?」
Alphonse R. Dsouza

@AJitそれは直接ではありません、ドキュメントはそれを言っています。最も簡単な方法は、Objective-C ++が理解できる形式に変換するObjective-Cクラスを作成することです。developer.apple.com/library/ios/documentation/Swift/Conceptual/...
アレハンドロイバン・

1
から派生する必要があることに注意してくださいNSObject!!! あなたはまっすぐclass Blah に迅速に宣言してそれを機能させることはできません。それはする必要がありますclass Blah : NSObject
デビッドT.16年

いくつかのケースのために、この答えを読んワース:stackoverflow.com/questions/26328034/...は の#import <商品名/ ProductModuleName-Swift.h>の#import <ProductModuleName-Swift.h>の#import <NewTestApp / NewTestApp:あなたは何をしているかに応じて、 -Swift.h>
inigo333 2017

Swift拡張機能をインポートする場合はどうでしょうか?
Ricardo

150

ここでは何をすべきかです:

  1. Objective-Cで新しいプロジェクトを作成する

  2. 新しい.swiftファイルを   作成する

    • ポップアップウィンドウが表示され、要求されます「ヘッダーを橋渡しするのObjective-Cを設定したいと思います」
    • はいを選択します。
  3. Xcodeプロジェクトファイルをクリックします。

  4. ビルド設定をクリックします

  5. 検索バーを見つけ、Defines Modulesを検索します

  6. 値をYesに変更します。

  7. 製品モジュール名を検索します。

  8. 値をプロジェクトの名前に変更します。

  9. アプリデリゲートで、以下を追加します。 #import "YourProjectName-Swift.h"


注: Swiftファイルを使用する場合は、次の行をインポートする必要があります。

#import "YourProjectName-Swift.h"


1
Defines modulein の値をBuild settingstoに変更することは、Yes私にとって固定されたものです。
Zakaria Braksa

埋め込みコンテンツにはSwiftが含まれています:はい、これも使用してください
Mohit

4
良い答えですが、ステップ7〜8はXcode 7.3.1以降では必要ありません
Sam B

私のために働いた!ありがとう。
itsdamslife 2016

1
ちょうどその追加したいYourProjectName内の#import "YourProjectName-Swift.h"プロジェクト名に特殊文字が含まれている場合に便利なステップ8からのプロジェクトの名前になりますと、あなたはあなたがそれをフォーマットする必要があります正確にどのようにではありません。
チャックボリス

40

Cocoapodsを使用していて、ObjCプロジェクトでSwiftポッドを使用しようとしている場合は、次の操作を行うだけです。

@import <FrameworkName>;

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


1
どうもありがとう!あなたは私の日を救った。
Esha 2017年

Cocoapodsを介して迅速なライブラリをインストールした場合、これは魅力のように機能します。賛成投票!!!
NSPratik 2018年

21

プロジェクトファイルのビルド設定に移動し、「Objective-C Generated Interface Header Name」を検索します。そのプロパティの値は、含める必要がある名前です。

「製品モジュール名」プロパティ(上記のプロパティがデフォルトで依存するプロパティ)が(私の場合のように)テスト/デバッグ/リリースなどでコンパイルするかどうかによって異なる場合は、このプロパティをそのプロパティから独立させます。カスタム名を設定することによるバリエーション。


15

Swift内部にファイルをインポートObjective-cすると、import適切に機能しない場合にこのエラーが発生する可能性があります。

注:Swiftファイルを外部からインポートする必要はありません。Swiftファイルを処理する1つのファイルをインポートするだけです。

Objective-Cプロジェクト内でSwiftファイル作成/コピーしたとき。ブリッジヘッダーが自動的に作成されます。

で確認Objective-C Generated Interface Header NameしてくださいTargets -> Build Settings

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

以上を踏まえKJExpandable-Swift.h、そのままインポートします。

あなたのは次のようになりますTargetName-Swift.h場合は、TargetNameプロジェクト名または別のターゲットに基づいて異なり、あなたが追加され、その上で動作している場合があります。

以下のように、私の目標はKJExpandableなので、KJExpandable-Swift.h
ここに画像の説明を入力してください


12

最初の一歩:-

[プロジェクトのターゲット- >ビルド設定- >検索(「定義」) - > モジュール定義 更新値いいえはい

「モジュールの定義」:はい

「常にSwift標準ライブラリを埋め込む」:はい

「Objective-C互換性ヘッダーのインストール」:はい

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

第二段階:-

以下のように、Objective C ".h"ファイルにSwiftファイルクラスを追加します。

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Objective C ".m"ファイルに 'ProjectName(Your Project Name)-Swift.h'をインポートします

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

クラスの前方宣言(@class)は非常に良い点です!ありがとう!
Philipp Otto

10

同じフレームワーク内の Objective-CファイルにSwiftコードをインポートする場合は、注意点が1つあります。フレームワーク名と山かっこを指定してそれを行う必要があります:

#import <MyFramework/MyFramework-Swift.h>

MyFrameworkこれが「製品モジュール名」のビルド設定です(PRODUCT_NAME = MyFramework)。

単に追加#import "MyFramework-Swift.h"するだけでは機能しません。ビルドされた製品ディレクトリをチェックすると(そのような#importが追加される前で、ターゲットにSwiftコードが含まれているビルドが1つ以上成功している場合)、ディレクトリにファイルが表示さMyFramework-Swift.hれますHeaders


8

Swift 4で作成したプロジェクトにObjective-Cファイルを追加した場合は、次のようにします。

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

リファレンス:https : //useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/


私のコードでは、swift 3からSwift 4.2に更新した後、動作しません
SNarula

どのエラーが発生していますか?私はSwift4.2で上記のコードを使用し、正常に動作しました。
Prashant Bhayani

わかりました。
Prashant Bhayani

4

同じプロジェクトのSwiftとObjective Cに関するプレリリースノートを確認する

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

インポートする必要があります

#import "SCLAlertView-Swift.h"

3
このエラーが表示されました: 'SCLAlertView-Swift.h'ファイルが見つかりません。
Viktor Radchenko 2014年

2
ファイル名ではなくプロジェクト名である必要があります-私の答えを見てください。
ビル

1
ドキュメントのリンクをありがとう。参考になりました。
louielouie 2014年

2
提供されたリンクから引用するには:作成しThe name of this header is your product module name followed by adding "-Swift.h".たクラス名ではなく、製品モジュールの名前であり、特定のファイルだけでなく、すべてのSwiftファイルのインポートを処理します
Chris

4

ビルドしようとしているターゲットのビルド設定で「Objective-C Generated Interface Header Name」を検索し(そうだとしましょうMyApp-Swift.h)、#import "MyApp-Swift.h"アクセスしようとしているソースファイルにこの設定の値()をインポートしますSwift API。

このフィールドのデフォルト値は$(SWIFT_MODULE_NAME)-Swift.hです。「Objective-C Generated Interface Header Name」設定の値フィールドをダブルクリックすると表示されます。

また、モジュール名にダッシュがある場合(それがだとしましょうMy-App)、$(SWIFT_MODULE_NAME)すべてのダッシュがアンダースコアに置き換えられます。したがって、追加する必要があります#import "My_App-Swift.h"


承認されたよりも優れています。ダッシュは20分無駄になりました。
Roi Mulia 2017年

3

SwiftファイルをObjective-Cクラスで使用する場合は、Xcode 8以降、以下の手順に従います。

Objective-Cでプロジェクトを作成した場合:

  1. 新しいSwiftファイルを作成する
  2. Xcodeは自動的にBridge-Headerファイルを要求します
  3. それを生成する
  4. Objective-Cコントローラーに「ProjectName-Swift.h」をインポートします(インターフェースではなく実装にインポートします)(プロジェクトの名前の間にスペースがある場合は、アンダースコア「Project_Name-Swift.h」を使用してください)
  5. SwiftでObjective-Cクラスにアクセスできるようになります。

それをコンパイルし、それが次のようなリンカーエラーを生成する場合:アーキテクチャx86_64またはarmv 7の以前のファイル(2.0)よりも新しいバージョンのSwift言語(3.0)でコンパイル

あなたのもう一つの変更を行います

  1. Xcode-> Project-> Target-> Build Settings-> Use Legacy Swift Language Version-> Yes

ビルドして実行します。


1
レガシー
Swift

1

ダッシュとアンダースコアに注意してください。これらは混同される可能性があり、プロジェクト名とターゲット名はSWIFT_MODULE_NAMEと同じにはなりません。

ダッシュとアンダースコア


1
#import <TargetName-Swift.h>

キーボードから入力すると#import <が表示され、自動的にXcodeがアドバイスを表示します。


-1

プロジェクト内で.PCHファイルを見つけます。#import "YourProjectName-Swift.h"これを追加します。 これにより、クラスヘッダーがインポートされます。特定のファイルにインポートする必要がないように。

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.