Die Schnittstelle mit C-Code von Swift kann eine wertvolle Lösung für die Nutzung vorhandener Bibliotheken und die Reduzierung von Codeduplizierungen sein. Es stellt jedoch eine besondere Herausforderung dar, wenn es eher um C-Klassen als um Funktionen geht. Dieser Artikel enthält eine detaillierte Anleitung zum Instanziieren und Bearbeiten von C-Klassen in Swift.
Bridging Header für C-Funktionen
Bevor wir uns mit der Interaktion von C-Klassen befassen, werfen wir einen Blick darauf der Prozess der Überbrückung zu C-Funktionen:
Definieren Sie einen Überbrückungsheader mit „C“-Funktionen, um die C-Funktionalität für Swift verfügbar zu machen:
<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 kann diese Funktionen dann direkt aufrufen:
<code class="swift">let type = String.fromCString(imageType(filename)) let dump = String.fromCString(hexdump(filename))</code>
Interaktion mit C-Klassen von Swift
Um mit C-Klassen in Swift zu arbeiten, ist der Ansatz etwas anders:
Erstellen Sie C Wrapper-Funktionen
Erstellen Sie für jede C-Klasse C-Wrapper-Funktionen, die mit ihrer Funktionalität interagieren:
<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>
Definieren Sie Bridge-Header für Wrapper-Funktionen
Fügen Sie die Wrapper-Funktionen in einen Bridging-Header ein:
<code class="c">#define ImageReader_hpp #ifdef __cplusplus extern "C" { #endif MBR *initialize(char *filename); const char *hexdump(MBR *object); #ifdef __cplusplus } #endif</code>
Instanziieren und interagieren von Swift aus
Instanziieren Sie in Swift die C-Klasse mithilfe der Initialisierungs-Wrapper-Funktion :
<code class="swift">let cppObject = initialize(filename)</code>
Zugriff auf Klassenmethoden mithilfe der Wrapper-Funktionen:
<code class="swift">let type = String.fromCString(hexdump(cppObject))</code>
Kapselung für saubereren Code
Um die Lesbarkeit des Codes zu verbessern, kapseln Sie die Überbrückungscode in einer Swift-Klasse, wodurch die Notwendigkeit einer direkten Interaktion mit C-Zeigern entfällt:
<code class="swift">class MBRWrapper { private var _object: MBR * init(filename: String) { _object = initialize(filename) } func hexdump() -> String { return String.fromCString(hexdump(_object)) } }</code>
Diese Abstraktion ermöglicht es Ihnen, mit C-Objekten wie nativen Swift-Objekten zu arbeiten und den zugrunde liegenden Überbrückungsmechanismus zu verbergen.
Das obige ist der detaillierte Inhalt vonWie interagieren Sie mit C-Klassen von Swift?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!