web-dev-qa-db-ja.com

SwiftのコードをObjective-Cにインポートする方法

私はSwiftでライブラリを書きましたが、Objective-Cで書かれた現在のプロジェクトにインポートすることができませんでした。

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

#import "SCLAlertView.Swift" - 'SCLAlertView.Swift' file not found
247

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

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

考慮事項:

  • ターゲット名にスペースが含まれている場合は、それらをアンダースコアに置き換えます(例:My ProjectMy_Project-Swift.hになります)

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

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

369
Bill

アップルのWebサイトからの指示:

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

パッケージ設定 ビルド設定 で、そのフレームワークターゲットの 定義モジュール 設定が はい に設定されていることを確認します。次の構文を使用し、適切な名前を代入して、そのフレームワークターゲットからそのフレームワークターゲット内の任意のObjective-C .mファイルにSwiftコードをインポートします。

#import "ProductName-Swift.h"

改訂:

インポートできるのは "ProductName-Swift.h" .mファイルのみです。

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

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

enter image description here

137
Andrei Papancea

何をするか:

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

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

    • "Objective-Cブリッジングヘッダを設定しますか?" とポップアップウィンドウが表示されます。
    • はい を選択します。
  3. Xcode Projectファイルをクリックします

  4. をクリックしてください - ビルド設定

  5. 検索バー を検索し、 /モジュール定義 を検索します。

  6. 値を はい に変更します。

  7. 製品モジュール名

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

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


注: /あなたがあなたのSwiftファイルを使用したい時はいつでもあなたは次の行をインポートしなければなりません:

#import "YourProjectName-Swift.h"

129
Sumit singh

Cocoapodを使用していて、ObjCプロジェクトでSwift Podを使用しようとしているのであれば、次のようにします。

@import <FrameworkName>;

enter image description here

32
KingPolygon

プロジェクトファイルのビルド設定に移動し、 "Objective-Cで生成されたインターフェイスのヘッダー名 を検索します。そのプロパティの値は含める必要がある名前です。

"Product Module Name"プロパティ(上記のプロパティがデフォルトで依存しているもの)がtest/debug/release/etc用にコンパイルされているかどうかによって異なる場合は(この場合のように)カスタム名を設定することによるバリエーション。

16
Lukas Kalinski

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

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

Swiftファイルを作成/コピーした場合 inside Objective-Cプロジェクト 。それは自動的にブリッジングヘッダを作成したでしょう。

Objective-C Generated Interface Header NameTargets -> Build Settingsを確認してください。

enter image description here

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

あなたのものはTargetName-Swift.hになります、ここでTargetNameはあなたのプロジェクト名またはあなたがそれに追加して実行しているかもしれない別のターゲットによって異なります。

私の目標の下にあるのはKJExpandableなのでKJExpandable-Swift.h
enter image description here

11
Kiran Jasvanee

最初のステップ: -

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

"モジュールの定義": _ yes _

"常にSwift標準ライブラリを埋め込む": _ yes _

"Objective-C互換ヘッダのインストール": _ yes _

enter image description here

第2ステップ: -

Objective C ".h"ファイルにSwiftファイルクラスを追加

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Objective Cの ".m"ファイルに 'ProjectName(あなたのプロジェクト名)-Swift.h'をインポートします。

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

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

#import "ProjectName-Swift.h"
9
Darshan Panchal

SwiftのコードをObjective-Cのファイル に同じ フレームワーク内でインポートする場合、注意点が1つあります。あなたはフレームワーク名と山括弧を指定することでそれをしなければなりません:

#import <MyFramework/MyFramework-Swift.h>

ここでのMyFrameworkは、 "Product Module Name"ビルド設定(PRODUCT_NAME = MyFramework)です。

#import "MyFramework-Swift.h"を追加するだけではうまくいきません。 (このような#importが追加される前に、ターゲットにいくつかのSwiftコードを使用して少なくとも1回正常にビルドされた)build productsディレクトリをチェックしても、HeadersディレクトリにファイルMyFramework-Swift.hがあるはずです。

8
Misha Karpenko

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/ /

5

同じプロジェクトの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"
4
Nitin Alabur

"Objective-Cで生成されたインタフェースヘッダ名" を構築しようとしているターゲットのBuild Settingsで検索し(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"を追加する必要があります。

3
Misha Karpenko

Swift ファイルを Objective-C classに使用したい場合は、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つの変更を加えなさい

  1. Xcode - >プロジェクト - >ターゲット - >ビルド設定 - >レガシーSwift言語バージョンを使用 - >はい

ビルドして実行します。

2
Dheeraj D

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

Dashes and underscores 

0
Naloiko Eugene
#import <TargetName-Swift.h>

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

0
Erhan Demirci