C et Swift favoris Bonjour à tous. Dans cet article, examinons comment bien gérer char **
dans Swift.
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.
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 *
. ..
--Cette implémentation: https://github.com/hnw/CStringArray/blob/master/CStringArray/CStringArray.swift
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