web-dev-qa-db-ja.com

SwiftからObjective-Cのコードを呼び出す方法

Appleの新しいSwift言語では、Objective-Cコードをどのように呼びますか。

Appleはそれらが1つのアプリケーションで共存できると述べたが、これはSwiftで新しいクラスを構築しながらObjective-Cで作られた古いクラスを技術的に再利用できるという意味ですか?

推論

Objective-Cはプラットフォームに依存しない言語ですが、Swiftはプラットフォームに依存します。したがって、Swiftでプラットフォームに依存しないコード(ビジネスロジックライブラリ)を書くのは賢明ではありません。しかし、プラットフォームに依存するコード(例えばインターフェース関連)を書くのは全く問題ありません。それは良い考えであると言っているわけではありませんが、それは間違いなく興味です。

899
David Mulder

SwiftでのObjective-Cクラスの使用

**使用したい既存のクラスがある場合は、実行してください。 ステップ2 そしてスキップして ステップ5。 (場合によっては、古いObjective-Cファイルに明示的な#import <Foundation/Foundation.hを追加する必要がありました。)**

ステップ1:Objective-Cの実装 - .mの追加

クラスに.mファイルを追加し、CustomObject.mという名前を付けます。

ステップ2:ブリッジングヘッダを追加する

.mファイルを追加すると、おそらく以下のようなプロンプトが表示されます。

Enter image description here

クリック はい

プロンプトが表示されなかった場合、または誤ってブリッジヘッダーを削除した場合は、新しい.hファイルをプロジェクトに追加して<#YourProjectName#>-Bridging-Header.hという名前を付けます。

状況によっては、特にObjective-Cフレームワークを扱うときには、Objective-Cクラスを明示的に追加しないとXcodeがリンカを見つけることができません。この場合、.hファイルを上記のように作成してから、そのパスをターゲットのプロジェクト設定にリンクしていることを確認してください。

Enter image description here

注意

プロジェクトを移動したり、リモートリポジトリを使用して他の人と共同作業したりしても機能するように、$(SRCROOT)マクロを使用してプロジェクトをリンクすることをお勧めします。 $(SRCROOT)は、あなたの.xcodeprojファイルを含むディレクトリと考えることができます。このように見えるかもしれません:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

ステップ3:Objective-Cヘッダーを追加する - .h

別の.hファイルを追加してCustomObject.hという名前を付けます。

ステップ4:Objective-Cのクラスを構築する

CustomObject.h

#import <Foundation/Foundation.h>

@interface CustomObject : NSObject

@property (strong, nonatomic) id someProperty;

- (void) someMethod;

@end

CustomObject.m

#import "CustomObject.h"

@implementation CustomObject 

- (void) someMethod {
    NSLog(@"SomeMethod Ran");
}

@end

ステップ5:ブリッジングヘッダにクラスを追加する

YourProject-Bridging-Header.h内:

#import "CustomObject.h"

ステップ6:あなたのオブジェクトを使う

SomeSwiftFile.Swift内:

var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

明示的にインポートする必要はありません。それがブリッジヘッダーの目的です。

Objective-CでのSwiftクラスの使い方

ステップ1:新しいSwiftクラスを作成する

プロジェクトに.Swiftファイルを追加し、MySwiftObject.Swiftという名前を付けます。

MySwiftObject.Swift内:

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val"

    init() {}

    func someFunction(someArg:AnyObject) -> String {
        var returnVal = "You sent me \(someArg)"
        return returnVal
    }   
}

ステップ2:SwjファイルをObjCクラスにインポートする

SomeRandomClass.m内:

#import "<#YourProjectName#>-Swift.h"

ファイル<#YourProjectName#>-Swift.hは、見えなくても、すでにプロジェクト内に自動的に作成されているはずです。

ステップ3:あなたのクラスを使う

MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);

// original
NSString * retString = [myOb someFunction:@"Arg"];
// xcode10 expands the external arg here
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];|

NSLog(@"RetString: %@", retString);

注意:

1。 CodeCompletionが思ったほど正確に動作していませんでした。私のシステムでは、 "cmd + r"でクイックビルドを実行すると、SwiftがObjective-Cのコードを見つけるのに役立ち、またその逆も同様でした。

2。 古いプロジェクトに.Swiftファイルを追加してエラーが発生した場合:dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib、完全に Xcodeを再起動してください

3。 もともとObjective-Cで純粋なSwiftクラスを@objc接頭辞を使って使うことは可能でしたが、Swift 2.0以降、これはもはや不可能です。オリジナルの説明は編集履歴を見てください。この機能が将来のSwiftバージョンで再び有効になった場合、それに応じて答えが更新されます。

1305
Logan

Appleのガイド「 CocoaでSwiftを使用する」および「Objective-C 」を参照してください。このガイドでは、SwiftからのObjective-CおよびCコードの使用方法、およびその逆の方法について説明し、既存のプロジェクトでObjective-C/CおよびSwiftパーツを組み合わせて一致させる方法についての推奨事項を示します。

コンパイラは、C関数とObjective-Cメソッドを呼び出すためのSwift構文を自動的に生成します。ドキュメントに見られるように、このObjective-Cは、

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

このSwiftコードに変わります:

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

Xcodeもこの変換をその場で行います - Swiftファイルの編集中にOpen Quicklyを使用してObjective-Cクラス名を入力すると、Swift対応バージョンのクラスヘッダーに移動できます。 (SwiftファイルのAPIシンボルをcmdクリックしても確認できます。) iOS 8 および OS X v10.10(Yosemite) developerライブラリはObjective-CとSwiftの両方の形式で表示されます(例: UIView )。

114
rickster

以下は、SwiftプロジェクトでObjective-Cコード(この場合はサードパーティによって提供されたフレームワーク)を使用するためのステップバイステップの説明です。

  1. 任意のObjective-CファイルをSwiftプロジェクトに追加する _ [ファイル] - > [新規] - > [新規ファイル] - > [Objective-Cファイル]を選択します。保存すると、ブリッジヘッダを追加するかどうかをXcodeが確認します。 'はい'を選択してください。 Gif:プロジェクトに空のファイルを追加してブリッジングヘッダを生成するhttp://www.derrrick.com/stackoverflow/1-empty-file.gif

簡単なステップで:

  1. プロンプトが表示されたら、OKをクリックします。表示されない場合は、次のように手動で作成します。iOSソースからヘッダーファイルを1つ作成し、ProjectName-Bridging-Headerという名前を付けます(例:Test -Bridging-Header)をクリックし、Swiftコンパイラコードのビルド設定 - > Objective-CブリッジでObjective-Cブリッジ名を追加します。(Test/Test-Bridging-Header.h)。ええ、これで完了です。

  2. 必要に応じて、追加したObjective-Cファイルを削除します(上のGIF画像では "anything"という名前)。もう必要ありません。

  3. ブリッジングヘッダファイルを開く - ファイル名は[YourProject] -Bridging-Header.hの形式です。 Xcode提供のコメントが含まれています。 含めたいObjective-Cファイルに1行のコードを追加します _、サードパーティ製のフレームワークなど。たとえば、Mixpanelをプロジェクトに追加するには、ブリッジングヘッダファイルに次のコード行を追加する必要があります。

    #import "Mixpanel.h"
  4. Swiftファイルでは、Swift構文では既存のObjective-Cコードを使用 _(この例の場合は、Mixpanel SDKメソッドなどを呼び出すことができます)。 XcodeがObjective-CをどのようにSwiftに変換するのかを理解する必要があります。 アップルのガイド は読みやすいです。あるいは、不完全な要約についてはこの答えを見てください。

Mixpanelの例:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("your-token")
    return true
}

それでおしまい!

注:プロジェクトからブリッジングヘッダーファイルを削除する場合、必ず「ビルド設定」に移動し、「Swift Compiler - Code」の下の「Objective-Cブリッジングヘッダー」の値を削除してください。ジェネレーション "#:。

57
derrrick

Niceという記事を読むことができますSwift&Cocoapods。基本的に、ブリッジングヘッダファイルを作成し、そこにすべてのObjective-Cヘッダを配置する必要があります。それから、ビルド設定からそれを参照する必要があります。その後、Objective-Cのコードを使うことができます。

let manager = AFHTTPRequestOperationManager()
manager.GET(
  "http://example.com/resources.json",
  parameters: nil,
  success: { (operation: AFHTTPRequestOperation!,
              responseObject: AnyObject!) in
      println("JSON: " + responseObject.description)
  },
  failure: { (operation: AFHTTPRequestOperation!,
              error: NSError!) in
      println("Error: " + error.localizedDescription)
  })

Appleの文書CocoaとObjective-CでSwiftを使うもご覧ください。

35
Jake Lin

C++、Objective-C、およびSwiftのコードを組み合わせる方法を示す簡単なXcode 6プロジェクトを書きました。

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

特に、SwiftからObjective-CとC++の関数を呼び出すの例です。

重要なのは、共有ヘッダーProject-Bridging-Header.hを作成し、そこにObjective-Cヘッダーを配置することです。

完全な例としてプロジェクトをダウンロードしてください。

23

ドキュメント :からの引用

モジュールとしてアクセス可能なObjective-Cフレームワーク(またはCライブラリ)は、Swiftに直接インポートできます。これには、Foundation、UIKit、SpriteKitなどのObjective-Cシステムフレームワークすべてと、システムに付属の共通Cライブラリが含まれます。たとえば、Foundationをインポートするには、このインポート文を作業中のSwiftファイルの先頭に追加するだけです。

import Foundation

このインポートにより、NSDate、NSURL、NSMutableData、およびそれらのすべてのメソッド、プロパティ、カテゴリを含むFoundation APIがすべてSwiftで直接利用できるようになります。

20
Gergo Erdosi

ここでもう1つ追加したいことがあります。

@ Loganの回答にとても感謝しています。ブリッジファイルと設定を作成するのに大いに役立ちます。

しかし、これらすべてのステップを実行した後でも、SwiftでObjective-Cクラスは得られません。

私はcocoapodsライブラリを使用し、それを私のプロジェクトに統合しました。これはpod "pop"です。

したがって、SwiftでObjective-Cのポッドを使用している場合は、クラスをSwiftに取得またはimportできない可能性があります。

あなたがしなければならない簡単なことは:

  1. <YOUR-PROJECT>-Bridging-Headerファイルに行き、
  2. ステートメント#import <ObjC_Framework>@import ObjC_Frameworkに置き換えます

例えば:(Pop library)

交換する

#import <pop/POP.h>

@import pop;

clang importが機能していない場合は#importを使用してください。

19
Kampai

Objective-CライブラリをSwiftに追加しようとしている人へのメモ:-ObjC inBuild Settingsを追加する必要があります->リンク->その他のリンカーフラグ

11
david72

ブリッジヘッダを作成したら、ビルド設定=>「Objective-Cブリッジヘッダ」を検索します。

そのすぐ下に "" Objective-Cが生成したインタフェースヘッダ名 "ファイルがあります。

そのファイルをView Controllerにインポートします。

例:私の場合: "Dauble-Swift.h"

eEter image description here

7
Avijit Nagare

New fileメニューをクリックして、ファイル選択言語Objectiveを選択します。その時それは自動的にクラス名を定義するために使われる "Objective-C Bridging Header"ファイルを生成します。

"Swift Compiler - Code Generation"の下の "Objective-C Bridging Header"。

4
Yogesh shelke
  1. NewFile - > Source - > headerファイルから.hファイルを作成します。
  2. それからファイルの名前を保存してください Your_Target_Name-Bridging-Header.h ここの人々は彼らのプロジェクト名を取ることによって一般的な間違いをしますが、両者が異なる場合、それはプロジェクトのターゲットの名前であるべきです。
  3. 次に、ビルド設定で Objective-C Bridging Header flagを検索し、新しく作成したブリッジングファイルのアドレスを入力します。ファイルを右クリックして - > Finderに表示 - >テキスト領域にファイルをドラッグします。その後、住所が入力されます。
  4. #import Your_Objective-C_file.hを使用
  5. SwiftファイルではObjCファイルにアクセスできますが、Swift言語のみです。
3
Nish

enter image description here SwiftからObjective Cのコードを呼び出す小さなサンプルを含むgithubのプロジェクトを追加しました。

SwiftからObjectiveCクラスを呼び出す

3
CrazyPro007

Xcode 10.1のSwift 4.2.1プロジェクトでは、Objective-Cファイルを簡単に追加できます。 Objective-CファイルをSwiftプロジェクトにブリッジするには、以下の手順に従ってください。

Step_01:Swift言語を使って新しいXcodeプロジェクトを作成します。

File> New> Project> objc

Step_02:Swiftプロジェクトに新しいObjective-Cファイルを追加します。

File> New> File...> macOS> Objective-C File

Step_03:ごく初期にSwiftプロジェクトに新しいObjective-Cファイルを追加した場合、Xcodeはあなたに尋ねます。

Would you like to configure an Objective-C bridging header

enter image description here

Step_04:オプションを選択してください:

Create Bridging Header

Step_05:対応するファイルが次の名前で生成されます。

Objc-Bridging-Header.h

enter image description here

Step_06:ブリッジヘッダにブリッジファイルパスを設定する必要があります。 Project Navigatorでobjcという名前のプロジェクトをクリックしてから、以下を選択します。

Build Settings> Objective-C Bridging Header> Objc-Bridging-Header.h

Step_07:Objc-Bridging-Header.hをそのボックスにドラッグアンドドロップしてファイルパスを生成します。

enter image description here

Step_08:Objc-Bridging-Header.hファイルを開き、使用したいObjective-CファイルをSwiftファイルにインポートします。

#import "SpecialObjcFile.m"

これがSpecialObjcFile.mの内容です。

#import <Foundation/Foundation.h>

@interface Person: NSObject {
@public
    bool busy;
}
@property
    bool busy;
@end

Step_09:SwiftファイルでObjective-Cクラスを使うことができます。

override func viewDidLoad() {
    super.viewDidLoad()
    let myObjcContent = Person()
    print(myObjcContent.busy)
}

enter image description here enter image description here

1
ARGeo

SwiftでのObjective-Cクラスの使用

  1. Objective-Cヘッダー.hおよび実装.mを追加します
    プロジェクトに<FileName>.mおよび<FileName>.hファイルを追加します

  2. ブリッジングヘッダーを追加
    。mファイルを追加するときに、_Would you like to configure an Objective-C bridging headerプロンプトで[はい]をクリックします

  3. クラスをブリッジングヘッダーに追加
    YourProject-Bridging-Header.hに行を追加#import "<FileName>.h"

Objective-CでのSwiftクラスの使用

  1. NSObjectを拡張する<FileName>.Swiftファイルをプロジェクトに追加します
  2. SwiftファイルをObjCクラスにインポート
    #import "<#YourProjectName#>-Swift.h"をObjective-Cファイルに追加します
  3. パブリックSwiftコードをマーク [@objcおよび@objcMembers]

続きを読む こちら

1
yoAlex5

目的-cを使用する双方向アプローチ-c目的-c

1

  1. Xcodeプロジェクトでbridge-header.hファイルを作成する
  2. ブリッジヘッダファイルに.hファイルをインポートする
  3. ビルド設定でbridge-Headerのパスを設定します。
  4. プロジェクトをきれいにする

2

  1. プロジェクトにObjective-Cファイルを作成します(自動的にビルド設定でパスを設定します)。
  2. ブリッジヘッダファイルに.hファイルをインポートする

今行ってもいい ありがとう

0
Sanjay Mali

Appleはこのドキュメントで公式ガイドを提供しています: how-to-call-objective-c-code-from-Swift

関連する部分は次のとおりです。

Objective-Cファイルのセットを同じアプリターゲット内のSwiftコードにインポートするには、Objective-Cブリッジングヘッダーファイルに依存しますこれらのファイルをSwiftに公開します。 Swiftファイルを既存のObjective-Cアプリに追加するか、Objective-Cファイルを既存のSwiftアプリに追加すると、Xcodeはこのヘッダーを作成します。

受け入れる場合、Xcodeは作成中のファイルとともにブリッジングヘッダーファイルを作成し、製品モジュール名の後に「-Bridging-Header.h」を付けて名前を付けます。または、[ファイル]> [新規]> [ファイル]> [オペレーティングシステム]> [ソース]> [ヘッダーファイル]を選択して、ブリッジヘッダーを自分で作成することもできます。

ブリッジングヘッダーを編集して、Objective-CコードをSwiftコードに公開します:

  1. Objective-Cブリッジングヘッダーで、Swiftに公開するすべてのObjective-Cヘッダーをインポートします
  2. ビルド設定のSwiftコンパイラ-コード生成で、Objective-Cブリッジングヘッダーのビルド設定にブリッジングヘッダーファイルへのパスがあることを確認します。パスは、ビルド設定でInfo.plistパスを指定する方法と同様に、プロジェクトに相対する必要があります。ほとんどの場合、この設定を変更する必要はありません。

ブリッジングヘッダーにリストされているすべてのパブリックObjective-Cヘッダーは、Swiftに表示されます。

0
Tibin Thomas

Logans answer は、最新のSwift 5を除いては正常に動作しますが、コンパイラエラーが発生します。これはSwift 5に取り組んでいる人のための修正です。

スイフト5

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val" as AnyObject

    override init() {}

    func someFunction(someArg:AnyObject) -> String {
        let returnVal = "You sent me \(someArg)"
        return returnVal
    }
}
0