1. ホーム
  2. objective-c

[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?

2022-03-17 22:18:33

質問

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

Appleは1つのアプリケーションで共存できると言っていましたが、これは技術的にObjective-Cで作られた古いクラスを再利用しながら、Swiftで新しいクラスを作ることができるということでしょうか?

どうすればいい?

SwiftでObjective-Cのクラスを使用する

<ブロッククオート

既存のクラスを使いたい場合は、以下のようにします。 ステップ2 に進みます。 ステップ5 . (いくつかのケースで、私は明示的に #import <Foundation/Foundation.h を古いObjective-CのFileに追加しました)。

ステップ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: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. コード補完の動作が期待通りにならない場合は、以下のコマンドでクイックビルドを実行してみてください。 R を使用して、Xcode が Swift のコンテキストから Objective-C コードの一部を見つけるのを助け、逆もまた同様です。

  2. を追加した場合 .swift ファイルを古いプロジェクトに追加すると、エラー dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib であれば、完全に Xcodeを再起動する .

  3. 元々、純粋な Swift クラスを使用することは可能でしたが ( NSObject を使用することでObjective-Cから見えるようになります。 @objc という接頭辞を付けることができなくなりました。現在、Objective-C で見えるようにするには、Swift オブジェクトが NSObjectProtocol (を継承するのが最も簡単な方法です。 NSObject であること)、あるいは enum マーク @objc のような整数型の生の値で指定します。 Int . を使用したSwift 1.xのコードの例については、編集履歴をご覧ください。 @objc これらの制約を受けずに