Behandle C char ** gut mit Swift

Sowohl C als auch Swift Favorit Hallo allerseits. Lassen Sie uns in diesem Artikel überlegen, wie Sie mit char ** in Swift gut umgehen können.

Sicherlich ist der Umgang mit char * in Swift nicht schlecht

Wie die Pioniere betonten, kann gesagt werden, dass die gegenseitige Konvertierung zwischen Swifts "String" -Typ und Cs "char *" -Typ vorhanden ist.

Wenn Sie mit "String # withCString" und "String # fromCString" vertraut sind, sollten Sie in der Lage sein, C-Systemaufrufbibliotheksaufrufe von Swift bequem zu verwenden.

Char ** ist übrigens ...?

Übrigens verwenden einige Aufrufe der C-Systemaufrufbibliothek "char **" als Argument, das auch von Swift verwendet werden kann. Zum Beispiel ist der Typ des fünften Arguments "argv" von Swifts "posix_spawn" wie folgt.

UnsafePointer<UnsafeMutablePointer<Int8>>>

Dies entspricht "char * const *" in C, aber ich glaube nicht, dass viel darüber diskutiert wird, was zu tun ist, wenn Sie dies in "[Stirng]" konvertieren möchten. Nachdem ich ratlos war, beschloss ich, die CStringArray-Klasse, die in Gist gefallen war, zu ändern und zu verwenden.

CStringArray

Die diesmal verwendete CStringArray-Klasse wird als Cocoa Touch Framework erstellt und kann mit Carthage installiert werden.

CStringArray nimmt "[String?]" Als Konstruktorargument und kann "char * const *" mit der Mitgliedsvariablen "pointers" abrufen. Das Folgende ist ein Verwendungsbeispiel.

let argv = CStringArray(["/bin/ls", "-la" , "/", nil])
posix_spawn(&pid, argv.pointers[0], &action, nil, argv.pointers, nil)

Da pointers ein Array von UnsafeMutablePointer <CChar> ist, können Sie die Nummer bei Bedarf mit count abrufen.

Wenn Sie "& argv.pointers" verwenden, ist es mit "char **" kompatibel. Wenn Sie jedoch "pointers" in der Implementierung neu schreiben, tritt ein Speicherverlust auf, sodass ich denke, dass es sicher ist, mit "char * const *" umzugehen. ..

Referenz-URL

--Diese Implementierung: https://github.com/hnw/CStringArray/blob/master/CStringArray/CStringArray.swift

Bitte um Meinungen

Tatsächlich kann es möglich sein, es ordentlich zu lösen, ohne eine solch robuste Klasse zu schaffen. Ich bin neu bei Swift, daher würde ich gerne von Profis hören.

Recommended Posts

Behandle C char ** gut mit Swift
Übergeben Sie C-Sprache char * an Swift
Erstellen Sie UnsafeMutablePointer <UnsafeMutablePointer <Int8>?>! In Swift für C char ** hoge
Behandeln Sie Zeiger wie UnsafePointer <T> in Swift
Teilen wird in Swift zu 0
Mehrdimensionales Array in Swift
Behandeln Sie Enum mit Mybatis TypeHandler
Fotobibliothek mit Swift UI
Reproduzieren Sie die Java-Enumeration in C #
Versuchen Sie, C-Sprache und Swift in einem Projekt (OS X, Linux) zu mischen.
Besiege den Aufwand, C-Arrays von Swift als Tupel zu behandeln