Maison >développement back-end >C++ >Comment interagir avec les classes C de Swift ?
L'interface avec le code C de Swift peut être une solution précieuse pour utiliser les bibliothèques existantes et réduire la duplication de code. Cependant, cela pose un défi spécifique lorsqu’il s’agit de classes C plutôt que de fonctions. Cet article fournit un guide détaillé sur la façon d'instancier et de manipuler les classes C à partir de Swift.
En-tête de pont pour les fonctions C
Avant de nous plonger dans l'interaction avec les classes C, passons en revue le processus de pontage vers les fonctions C :
Définissez un en-tête de pontage avec les fonctions "C" pour exposer la fonctionnalité 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>
Le code Swift peut alors appeler directement ces fonctions :
<code class="swift">let type = String.fromCString(imageType(filename)) let dump = String.fromCString(hexdump(filename))</code>
Interagir avec les classes C de Swift
Pour travailler avec les classes C dans Swift, l'approche est légèrement différente :
Créer du C Fonctions Wrapper
Pour chaque classe C, créez des fonctions wrapper C qui s'interfacent avec ses fonctionnalités :
<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>
Définir l'en-tête de pont pour les fonctions Wrapper
Inclure les fonctions wrapper dans un en-tête de pont :
<code class="c">#define ImageReader_hpp #ifdef __cplusplus extern "C" { #endif MBR *initialize(char *filename); const char *hexdump(MBR *object); #ifdef __cplusplus } #endif</code>
Instancier et interagir à partir de Swift
Dans Swift, instanciez la classe C à l'aide de la fonction wrapper d'initialisation :
<code class="swift">let cppObject = initialize(filename)</code>
Accédez aux méthodes de classe à l'aide des fonctions wrapper :
<code class="swift">let type = String.fromCString(hexdump(cppObject))</code>
Encapsulation pour un code plus propre
Pour améliorer la lisibilité du code, encapsulez le pontant le code dans une classe Swift, supprimant le besoin d'interaction directe avec les pointeurs 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>
Cette abstraction vous permet de travailler avec des objets C comme des objets Swift natifs, en masquant le mécanisme de pontage sous-jacent.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!