Swift からの C コードとの対話は、既存のライブラリを利用し、コードの重複を減らすための貴重なソリューションとなり得ます。ただし、関数ではなく C クラスを扱う場合、特有の課題が生じます。この記事では、Swift 内から C クラスをインスタンス化して操作する方法に関する詳細なガイドを提供します。
C 関数のブリッジング ヘッダー
C クラスの対話について詳しく説明する前に、確認してみましょう。 C 関数へのブリッジングのプロセス:
「C」関数を含むブリッジング ヘッダーを定義して C 機能を Swift に公開します:
<code class="c">#define ImageReader_hpp #ifdef __cplusplus extern "C" { #endif const char *hexdump(char *filename); const char *imageType(char *filename); #ifdef __cplusplus } #endif</code>
Swift コードはこれらの関数を直接呼び出すことができます:
<code class="swift">let type = String.fromCString(imageType(filename)) let dump = String.fromCString(hexdump(filename))</code>
Swift から C クラスを操作する
Swift で C クラスを操作するには、アプローチが少し異なります。
C を作成するラッパー関数
C クラスごとに、その機能とインターフェイスする C ラッパー関数を作成します。
<code class="c++">MBR *initialize(char *filename) { return new MBR(filename); } const char *hexdump(MBR *object) { static char retval[2048]; strcpy(retval, object->hexdump()); return retval; }</code>
ラッパー関数のブリッジ ヘッダーを定義します
ブリッジヘッダーにラッパー関数を含めます:
<code class="c">#define ImageReader_hpp #ifdef __cplusplus extern "C" { #endif MBR *initialize(char *filename); const char *hexdump(MBR *object); #ifdef __cplusplus } #endif</code>
Swift からインスタンス化して対話します
Swift で、初期化ラッパー関数を使用して C クラスをインスタンス化します。 :
<code class="swift">let cppObject = initialize(filename)</code>
ラッパー関数を使用したクラス メソッドへのアクセス:
<code class="swift">let type = String.fromCString(hexdump(cppObject))</code>
よりクリーンなコードのカプセル化
コードの可読性を向上させるには、 Swift クラスでコードをブリッジし、C ポインターとの直接対話の必要性を排除します。
<code class="swift">class MBRWrapper { private var _object: MBR * init(filename: String) { _object = initialize(filename) } func hexdump() -> String { return String.fromCString(hexdump(_object)) } }</code>
この抽象化により、基礎となるブリッジ メカニズムを非表示にして、ネイティブ Swift オブジェクトのように C オブジェクトを操作できるようになります。
以上がSwift の C クラスとどのように対話しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。