Swiftでは、どのようにObjective-Cコードを呼び出すのですか?
Appleは1つのアプリケーションで共存できると述べましたが、これは、Swiftで新しいクラスを構築しながら、Objective-Cで作成された古いクラスを技術的に再利用できることを意味しますか?
Swiftでは、どのようにObjective-Cコードを呼び出すのですか?
Appleは1つのアプリケーションで共存できると述べましたが、これは、Swiftで新しいクラスを構築しながら、Objective-Cで作成された古いクラスを技術的に再利用できることを意味しますか?
回答:
使用する既存のクラスがある場合は、ステップ2を実行してから、ステップ5にスキップします。(場合によっては
#import <Foundation/Foundation.h
、古いObjective-Cファイルに明示を追加する必要がありました。)
.m
クラスにファイルを追加し、名前を付けCustomObject.m
ます。
.m
ファイルを追加すると、次のようなプロンプトが表示されます。
[ はい]をクリックします。
プロンプトが表示されなかった場合、または誤ってブリッジヘッダーを削除.h
した場合は、プロジェクトに新しいファイルを追加して名前を付け<#YourProjectName#>-Bridging-Header.h
ます。
状況によっては、特にObjective-Cフレームワークを使用する場合、Objective-Cクラスを明示的に追加せず、Xcodeがリンカーを見つけられない場合があります。この場合、.h
上記の名前のファイルを作成し、ターゲットのプロジェクト設定でそのパスを次のようにリンクします。
注意:
$(SRCROOT)
マクロを使用してプロジェクトをリンクすることをお勧めします。これにより、プロジェクトを移動したり、リモートリポジトリを使用して他の人と作業したりしても、プロジェクトは引き続き機能します。$(SRCROOT)
.xcodeprojファイルを含むディレクトリと考えることができます。次のようになります。
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
別の.h
ファイルを追加して名前を付けCustomObject.h
ます。
に 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
でYourProject-Bridging-Header.h
:
#import "CustomObject.h"
でSomeSwiftFile.swift
:
var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
明示的にインポートする必要はありません。これがブリッジングヘッダーの目的です。
.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)"
}
}
でSomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
ファイル:<#YourProjectName#>-Swift.h
見えない場合でも、プロジェクトで既に自動的に作成されているはずです。
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);
コード補完が期待どおりに動作しない場合は、でクイックビルドを実行して、⌘⇧RXcodeがSwiftコンテキストからObjective-Cコードの一部を見つけられるようにし、その逆も可能です。
.swift
古いプロジェクトにファイルを追加してエラーが発生したdyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
場合は、Xcodeを完全に再起動してみてください。
プレフィックスNSObject
を使用してObjective-Cに表示される純粋なSwiftクラス(の子孫ではない)を使用することは当初可能でしたが@objc
、これはもはや不可能です。Objective-Cで表示されるようにするには、Swiftオブジェクトが準拠するクラスである必要がありますNSObjectProtocol
(これを行う最も簡単な方法はから継承することですNSObject
)、またはのような整数型の未加工の値でenum
マーク@objc
を付ける必要がありますInt
。これらの制限なしでを使用して、Swift 1.xコードの例の編集履歴を表示できます@objc
。
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
)。
以下は、SwiftプロジェクトでObjective-Cコード(この場合はサードパーティが提供するフレームワーク)を使用するための詳細な手順です。
簡単な手順:
プロンプトが表示され、[OK]をクリックします。表示されない場合は、次のように手動で作成します... iOSソースからヘッダーファイルを1つ作成し、ProjectName-Bridging-Headerという名前を付けます(例:Test -Bridging-Header)、次にSwiftコンパイラコードのビルド設定に移動します-> Objective-CブリッジはObjective-Cブリッジ名..(Test / Test-Bridging-Header.h)を追加します。ええ、それは完全です。
必要に応じて、追加したObjective-Cファイル(上のGIF画像では「anything」という名前)を削除します。もう必要ありません。
ブリッジヘッダーファイルを開きます。ファイル名の形式は[YourProject] -Bridging-Header.hです。Xcode提供のコメントが含まれています。サードパーティのフレームワークなど、含めるObjective-Cファイルのコード行を追加します。たとえば、Mixpanelをプロジェクトに追加するには、次のコード行をブリッジヘッダーファイルに追加する必要があります。
#import "Mixpanel.h"
これで、どの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ブリッジヘッダー」の値を削除してください。
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の使用」もご覧ください。
私は、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ヘッダーを配置することです。
完全な例としてプロジェクトをダウンロードしてください。
@Loganの回答にとても感謝しています。ブリッジファイルとセットアップを作成するのに役立ちます。
しかし、これらすべての手順を実行した後も、SwiftでObjective-Cクラスを取得できません。
cocoapods
ライブラリを使用して、プロジェクトに統合しました。それはpod "pop"
です。
したがって、SwiftでObjective-Cポッドを使用している場合、Swift import
にクラスまたはクラスを取得できない可能性があります。
あなたがしなければならない単純なことは:
<YOUR-PROJECT>-Bridging-Header
ファイルに移動し、#import <ObjC_Framework>
を次のように置き換えます@import ObjC_Framework
例:(ポップライブラリ)
交換する
#import <pop/POP.h>
と
@import pop;
が機能していないclang import
ときに使用し#import
ます。
ドキュメントからの引用:
モジュールとしてアクセス可能なObjective-Cフレームワーク(またはCライブラリ)は、Swiftに直接インポートできます。これには、Foundation、UIKit、SpriteKitなどのObjective-Cシステムフレームワークのすべてと、システムに付属している一般的なCライブラリが含まれます。たとえば、Foundationをインポートするには、作業しているSwiftファイルの先頭に次のインポートステートメントを追加するだけです。
import Foundation
このインポートにより、NSDate、NSURL、NSMutableDataを含むすべてのFoundation API、およびそれらのすべてのメソッド、プロパティ、カテゴリがSwiftで直接利用できるようになります。
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)
}
ローガンの答えは最新のものを除いてうまくいきますSwift 5
ではコンパイラエラーが発生する場合をます。Swift 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
}
}
ヘッダー.h
と実装.m
ファイルを追加する-Cocoaクラスファイル(Objective-C)
例MyFileName
ヘッダをブリッジングを設定
あなたが表示されたらWould you like to configure an Objective-C bridging header
クリックを- はい
<target_name>-Bridging-Header.h
自動的に生成されますブリッジング・ヘッダーにクラスを追加し
て<target_name>-Bridging-Header.h
行を追加します。#import "<MyFileName>.h"
PS既存のObjective-CファイルをSwiftプロジェクトに追加する必要がある場合は、 Bridging-Header.h
事前にしてください
を追加し<MyFileName>.swift
て拡張するNSObject
SwiftファイルをObjCクラス
にインポート#import "<#YourProjectName#>-Swift.h"
するObjective-Cファイルに追加する
公開Swiftコードをマークする[@objcおよび@objcMembers]
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コードに公開します。
ブリッジングヘッダーにリストされているすべてのObjective-Cヘッダーは、Swiftに表示されます。