Manipulez bien le caractère C ** avec Swift

C et Swift favoris Bonjour à tous. Dans cet article, examinons comment bien gérer char ** dans Swift.

Certes, la gestion de char * dans Swift n'est pas mauvaise

Comme l'ont souligné les pionniers, on peut dire que la conversion mutuelle entre le type «String» de Swift et le type «char *» de C est en place.

Si vous connaissez String # withCString et String # fromCString, vous devriez pouvoir utiliser facilement les appels de bibliothèque d'appels système C depuis Swift.

Au fait, char ** est ...?

En passant, certains appels de bibliothèque d'appels système C prennent char ** comme argument, qui peut également être utilisé depuis Swift. Par exemple, le type du cinquième argument «argv» de «posix_spawn» de Swift est le suivant.

UnsafePointer<UnsafeMutablePointer<Int8>>>

Cela correspond à char * const * en C, mais je ne pense pas qu'il y ait beaucoup de discussions sur ce qu'il faut faire lorsque vous voulez convertir cela en [Stirng]. Après avoir été perdu, j'ai décidé de modifier et d'utiliser la classe CStringArray qui était tombée dans Gist.

CStringArray

La classe CStringArray utilisée cette fois est créée en tant que Cocoa Touch Framework et peut être installée avec Carthage.

CStringArray prend [String?] Comme argument de constructeur et peut récupérer char * const * avec la variable membre pointers. Voici un exemple d'utilisation.

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

pointers est un tableau de ʻUnsafeMutablePointer , donc vous pouvez récupérer le nombre avec count` si nécessaire.

Si vous utilisez & argv.pointers, il sera compatible avec char **, mais si vous réécrivez les pointeurs dans l'implémentation, une fuite de mémoire se produira, donc je pense qu'il est sûr de gérer avec char * const *. ..

URL de référence

--Cette implémentation: https://github.com/hnw/CStringArray/blob/master/CStringArray/CStringArray.swift

Demande d'avis

En fait, il peut être possible de le résoudre proprement sans créer une classe aussi robuste. Je suis nouveau sur Swift, alors j'aimerais beaucoup entendre des professionnels.

Recommended Posts

Manipulez bien le caractère C ** avec Swift
Passer le caractère de langage C * à Swift
Créer UnsafeMutablePointer <UnsafeMutablePointer <Int8>?>! En Swift pour C char ** hoge
Gérer les pointeurs tels que UnsafePointer <T> dans Swift
Divide devient 0 dans Swift
Tableau multidimensionnel dans Swift
Gérer Enum avec Mybatis TypeHandler
Photothèque avec Swift UI
Reproduire l'énumération Java en C #
Essayez de mélanger le langage C et Swift dans un seul projet (OS X, Linux)
Élimine les tracas liés au traitement des tableaux C comme des tuples par Swift