1. ホーム
  2. objective-c

[解決済み] Objective-CのクラスからSwiftの関数を呼び出す

2023-02-07 13:20:21

質問

私は古いObjective-Cのプロジェクトを持っており、私は新しいSwiftの関数とオブジェクトを呼び出すために、私はファイル"を作成しました。 <ProjectName>-Bridging-Header.h と" <ProjectName>-Swift.h "。

は、SwiftからObjective-Cへの関数呼び出しは簡単でしたが、逆は問題があります。

そこで、簡単なクラス "System.Swift"を作成しました。

import Foundation

@objc class System : NSObject {

    @objc func printSome() {
        println("Print line System");
    }
    
}

今、私はドキュメントに従って ここで で、その中の <...>-Swift.h ファイルには、次のように書いています。

@class System;

@interface System : NSObject

-(void)printSome;

@end

そして、私は私のObjective-Cクラスの中にそれをインポートしています。この時点で、私のObjective-Cコードの私のObjective Cクラス(現在UIViewController)内で私は"printSome"メソッドを呼び出そうとしている。

- (void)viewDidLoad
{
    [super viewDidLoad];
    System * sis = [[System alloc] init];
    [sis printSome];
    //any additional setup after loading the view from its nib.
}

を実行すると、次のようなエラーが発生します。

i386 アーキテクチャ用の未定義シンボル: " OBJC_CLASS $_System" です。 から参照されています。 objc-class-ref in "ObjectiveC_Class_That_Call_Swift_Object".o ld: symbol(s) not found for architecture i386 clang: エラー: リンカのコマンドに失敗しました。 コマンドは終了コード 1 で失敗しました (呼び出しを確認するには -v を使用します)

どのように解決するのですか?

問題は解決されました。 .h ファイルを Objective-C という名前のクラス <ProductModuleName>-Swift.h しかし、後でわかったことですが、コンパイラは必要なファイルを見えないように作成するので、このステップは必要ありません。

単純にインクルードする <ProductModuleName>-Swift.h を含めるだけで、動作するはずです。