iOS
SwiftとObjective-Cの相互運用性
サーチ…
SwiftでのObjective-Cクラスの使用
既存のクラスを使用する場合は、 ステップ2を実行してからステップ5に進みます。 (場合によっては、明示的な
#import <Foundation/Foundation.h
を古いObjCファイルに追加する必要がありました)
ステップ1:Objective-C実装の追加 - .m
クラスに.m
ファイルを追加し、 CustomObject.m
という名前を付けCustomObject.m
手順2:ブリッジヘッダーを追加する
.m
ファイルを追加すると、次のようなプロンプトが表示されます。
はいをクリックしてください!
プロンプトが表示されなかったり、間違ってブリッジヘッダーを削除した場合は、新しい.h
ファイルをプロジェクトに追加し、その名前を<#YourProjectName#>-Bridging-Header.h
特にObjCフレームワークで作業する場合、Objective-Cクラスを明示的に追加せず、Xcodeでリンカーを見つけることができない場合があります。この場合、上記のような名前の.h
ファイルを作成し、そのパスをターゲットのプロジェクト設定にリンクするようにします。
注意
$(SRCROOT)
マクロを使用してプロジェクトをリンクするのがベストプラクティスです。プロジェクトを移動したり、リモートリポジトリを使用して他のプロジェクトと作業しても機能します。 $(SRCROOT)
は.xcodeprojファイルを含むディレクトリと考えることができます。次のようになります。
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
ステップ3:Objective-Cヘッダーの追加 - .h
別の.h
ファイルを追加し、 CustomObject.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);
NSString * retString = [myOb someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);
注意:
1. CodeCompletionは、私が望むように正確に動作していませんでした。私のシステムでは、「cmd + r」というクイックビルドを実行すると、SwiftがObjcコードの一部を見つけやすくなり、その逆も同様です。
2. .swift
ファイルを古いプロジェクトに追加してエラーが発生した場合: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
、 Xcodeを完全に再起動してみてください。
3. Objective-CではSwift 2.0の後に@objc
プレフィックスを使用して純粋なSwiftクラスを使用することは元々可能でしたが、これはもはや不可能です。元の説明については、編集履歴を参照してください。将来のSwiftバージョンでこの機能を再び有効にすると、それに応じて回答が更新されます。