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

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

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、次のようなプロンプトが表示されることがあります。

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

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

プロンプトが表示されなかった場合、またはブリッジ ヘッダーを誤って削除した場合は、.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);

ノート:

  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マークされている である必要があります。@objcInt@objcこれらの制限なしで使用する Swift 1.x コードの例の編集履歴を表示できます。

おすすめ記事