Swift では、Objective-C コードをどのように呼び出すのでしょうか?
Apple は、これらが 1 つのアプリケーション内で共存できると述べていますが、これは、Objective-C で作成された古いクラスを技術的に再利用しながら、Swift で新しいクラスを構築できることを意味しますか?
ベストアンサー1
Swift で Objective-C クラスを使用する
使用したい既存のクラスがある場合は、手順 2 を実行してから手順 5に進みます。(場合によっては、
#import <Foundation/Foundation.h
古い Objective-C ファイルに明示的に追加する必要がありました。)
ステップ 1: Objective-C 実装を追加する -- .m
.m
クラスにファイルを追加し、名前を付けますCustomObject.m
。
ステップ2: ブリッジングヘッダーを追加する
ファイルを追加すると.m
、次のようなプロンプトが表示されることがあります。
[はい]をクリックします。
プロンプトが表示されなかった場合、またはブリッジ ヘッダーを誤って削除した場合は、.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: ブリッジングヘッダーにクラスを追加する
で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);
ノート:
コード補完が期待どおりに動作しない場合は、を使用してクイックビルドを実行し、⌘⇧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
@objc
これらの制限なしで使用する Swift 1.x コードの例の編集履歴を表示できます。