SwiftからObjective-Cコードを呼び出すにはどうすればよいですか?


974

Swiftでは、どのようにObjective-Cコードを呼び出すのですか?

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


13
CocoaおよびObjective-CでのSwiftの使用に関する Appleのガイドを参照してください。
リクスター


10
この質問が非常に多くの賛成票と賞金を獲得するのは興味深いことです。初めて見たとき、RTFMだと思いました。現在のところ、公式にはSwiftを文書化しているリソースが2つまたは3つしかなく、その1つは完全にこれに完全に専念している(そして最初のコメントでリンクされている)ため、実際には調査は示されていません。
アナログファイル

6
@EvolGate:それがプラットフォームに依存しない言語になるのを妨げるObjective Cには何が欠けているのですか?言語と言語標準ライブラリはオープンソースです。Objective Cは、Windows、Os X、Linux、BSD、Solaris、およびGCCまたはLLVMのいずれかでサポートされているその他のプラットフォームで使用できます。GCCでもLLVMでもサポートされていない場合でも、適切なCコンパイラを使用してObjective Cを任意のプラットフォームに簡単に移植できます。これよりもプラットフォームに依存しない方法はわかりません。
アナログファイル

2
@DavidMulder:「推論」セクションはまだ必要ですか?
フランク

回答:


1395

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

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

ステップ1:Objective-C実装を追加する-.m

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

手順2:ブリッジヘッダーを追加する

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

「Objective-Cブリッジヘッダーを構成する」かどうかを尋ねるXcodeのmacOSシートスタイルダイアログ

[ はい]をクリックします。

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

状況によっては、特にObjective-Cフレームワークを使用する場合、Objective-Cクラスを明示的に追加せず、Xcodeがリンカーを見つけられない場合があります。この場合、.h上記の名前のファイルを作成し、ターゲットのプロジェクト設定でそのパスを次のようにリンクします。

上記の段落を説明するアニメーション

注意:

$(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:Bridging-Headerにクラスを追加する

YourProject-Bridging-Header.h

#import "CustomObject.h"

ステップ6:オブジェクトを使用する

SomeSwiftFile.swift

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

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

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

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

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

MySwiftObject.swift

import Foundation

@objc(MySwiftObject)
class MySwiftObject : NSObject {

    @objc
    var someProperty: AnyObject = "Some Initializer Val" as NSString

    init() {}

    @objc
    func someFunction(someArg: Any) -> NSString {
        return "You sent me \(someArg)"
    }
}

ステップ2:Swiftファイルを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);

NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];

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

ノート:

  1. コード補完が期待どおりに動作しない場合は、でクイックビルドを実行して、RXcodeがSwiftコンテキストからObjective-Cコードの一部を見つけられるようにし、その逆も可能です。

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

  3. プレフィックスNSObjectを使用してObjective-Cに表示される純粋なSwiftクラス(の子孫ではない)を使用することは当初可能でしたが@objc、これはもはや不可能です。Objective-Cで表示されるようにするには、Swiftオブジェクトが準拠するクラスである必要がありますNSObjectProtocol(これを行う最も簡単な方法はから継承することですNSObject)、またはのような整数型の未加工の値でenumマーク@objcを付ける必要がありますIntこれらの制限なしでを使用して、Swift 1.xコードの例の編集履歴を表示できます@objc


5
@objcまたはSwiftメソッドでメソッドに注釈を付ける必要があることが重要です。Objective-Cからは表示されません。
トマーシュリナート2014年

29
あなたが正しいです。Cocoaオブジェクトを使用しない場合にのみ指定する必要があります。Objective-Cでアクセスおよび使用できるようにするには、SwiftクラスがObjective-Cクラスの子孫であるか、@ objcとマークされている必要があります。
トーマス・リンハート


2
参照:WWDC 2014セッション406:SwiftとObjective-Cの統合
Stuart M

6
Objective CフレームワークをSwiftにインポートする場合は、Obj Cフレームワークが依存するすべてのフレームワークをプロジェクトにインポートし(ビルドフェーズ->ライブラリとバイナリをリンク)、プレフィックスヘッダーファイルに#importを追加します。ビルド設定(プレフィックスヘッダーフィールド)でプロジェクトに追加する必要があります。UIKitやFoundationなどのフレームワークが含まれます。これらはSwift内からすでに使用されています。これは何時間も私をつまずかせました、そして誰もこれらのステップを文書化したようではないようです。
user1021430 14年

121

CocoaおよびObjective-CでのSwiftの使用に関する Appleのガイドを参照してください。このガイドでは、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)開発者ライブラリのすべてのAPIリファレンスドキュメントは、Objective-CとSwiftの両方で表示できますフォーム(例UIView)。


3
直接リンクアップルのドキュメント:既存のプロジェクトでスウィフトを統合する方法developer.apple.com/library/prerelease/ios/documentation/Swift/...
skywinder

ヘッダーファイルが必要な理由とリンクフェーズでのヘッダーファイルの使用方法に興味がある場合は、このManual Swift:Swift / Objective-Cビルドパイプラインの理解
Honey

62

以下は、SwiftプロジェクトでObjective-Cコード(この場合はサードパーティが提供するフレームワーク)を使用するための詳細な手順です。

  1. File- > New-> New File-> Objective-C Fileを選択して、Objective-CファイルをSwiftプロジェクトに追加します。保存すると、Xcodeはブリッジヘッダーを追加するかどうかを尋ねます。「はい」を選択します。(ソース:derrrick.comGIF:空のファイルをプロジェクトに追加し、ブリッジヘッダーを生成する

簡単な手順:

  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ファイルのコード行を追加します。たとえば、Mixpanelをプロジェクトに追加するには、次のコード行をブリッジヘッダーファイルに追加する必要があります。

    #import "Mixpanel.h"
  4. これで、どのSwiftファイルでも、既存のObjective-CコードをSwift構文で使用できます(この例の場合、Mixpanel SDKメソッドなどを呼び出すことができます)。XcodeがObjective-CをSwiftに変換する方法を理解する必要があります。Appleのガイドはすぐに読むことができます。または、不完全な要約についてはこの回答を参照してください。

Mixpanelの例:

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

それでおしまい!

注:プロジェクトからブリッジヘッダーファイルを削除する場合は、ビルド設定に移動し、「Swiftコンパイラ-コード生成」の下の「Objective-Cブリッジヘッダー」の値を削除してください。


39

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の使用」もご覧ください。


25

私は、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ヘッダーを配置することです。

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


24

ここでもう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

例:(ポップライブラリ)

交換する

#import <pop/POP.h>

@import pop;

が機能していないclang importときに使用し#importます。


#importが機能していないときにclangインポートを使用します。何?@importを使うべきだと言っただけではありませんか?!
Honey

22

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

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

import Foundation

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


12

スウィフトにObjective-Cのライブラリを追加しようとしている誰のためだけ注意:追加する必要があり-ObjCビルド設定 - > リンク - > その他のリンカフラグ


どうして?このフラグの機能と追加する理由に関する情報を追加してください。
ヨハン・カールソン

9

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

すぐ下に、「 "Objective-C Generated Interface Header Name"ファイルがあります。

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

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

eEter画像の説明はこちら


5

[ 新しいファイル]メニューをクリックし、ファイルを選択し、言語を選択します。その際、クラス名の定義に使用される「Objective-Cブリッジヘッダー」ファイルが自動的に生成されます。

「Swift Compiler-Code Generation」の「Objective-C Bridging Header」。


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


3

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:新しいObjective-CファイルをSwiftプロジェクトに初めて追加すると、Xcodeから次のように尋ねられます。

Would you like to configure an Objective-C bridging header

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

Step_04:オプションを選択します。

Create Bridging Header

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

Objc-Bridging-Header.h

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

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

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

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

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

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

#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)
}

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


1

ローガンの答えは最新のものを除いてうまくいきます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
    }
}

1

Swiftコンシューマー、Objective-Cプロデューサー

  1. ヘッダー.hと実装.mファイルを追加する-Cocoaクラスファイル(Objective-C)
    MyFileName

  2. ヘッダをブリッジングを設定
    あなたが表示されたらWould you like to configure an Objective-C bridging headerクリックを- はい

    • <target_name>-Bridging-Header.h 自動的に生成されます
    • ビルド設定-> Objective-Cブリッジヘッダー
  3. ブリッジング・ヘッダーにクラスを追加し
    <target_name>-Bridging-Header.h行を追加します。#import "<MyFileName>.h"

PS既存のObjective-CファイルをSwiftプロジェクトに追加する必要がある場合は、 Bridging-Header.h事前にしてください

Objective-Cコンシューマー、Swiftプロデューサー

  1. を追加し<MyFileName>.swiftて拡張するNSObject

  2. SwiftファイルをObjCクラス
    にインポート#import "<#YourProjectName#>-Swift.h"するObjective-Cファイルに追加する

  3. 公開Swiftコードをマークする[@objcおよび@objcMembers]


0

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

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

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

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

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

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

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


0

Objective-C Objective-Cを使用するための双方向アプローチ

1

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

2

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

行くようになりました良い 感謝を

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