Comment créer un UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>
Je travaille avec une API C de Swift et de l'une des méthodes que j'ai besoin d'appeler j'ai besoin de donner un
UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>
Plus D'Infos:
Swift Interface:
public func presage_predict(prsg: presage_t, _ result: UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>) -> presage_error_code_t
C D'Origine:
presage_error_code_t presage_predict(presage_t prsg, char*** result);
- Quelle est la fonction C déclarés et que fait-il?
- Swift Interface: public func presage_predict(ld: presage_t, _ résultat: UnsafeMutablePointer<UnsafeMutablePointer<UnsafeMutablePointer<Int8>>>) -> presage_error_code_t C: presage_error_code_t presage_predict (presage_t ld, char*** result);
- semble que vous ont essayé d'utiliser le présage de la bibliothèque à des fins de prédiction. Je suis en train de le construire sur xcode mais arriver a échoué. pourriez-vous m'apprendre comment vous avez fait ?
Vous devez vous connecter pour publier un commentaire.
Généralement, si une fonction prend un
UnsafePointer<T>
paramètreensuite, vous pouvez passer une variable de type
T
comme dans "inout" paramètre avec&
. Dans votre cas,T
estqui est le Swift de cartographie de
char **
. Vous pouvez donc appeler la fonction Ccomme
À partir de la documentation et des exemples de code du Présage de la bibliothèque, je
comprendre qu'il alloue un tableau de chaînes de caractères et affecte le
l'adresse de ce tableau à la variable pointée par
prediction
.Pour éviter une fuite de mémoire, ces chaînes ont à être libéré suite
avec
De démontrer que cela fonctionne réellement, j'ai pris le premier
partie de la démo de code à presage_c_demo.c et traduit
Swift:
Ce réellement travaillé et produit la sortie
char **
paramètre. Il faut unchar ***
, qui est un pointeur vers unechar **
.Il peut y avoir une meilleure façon, mais cela va dans l'aire de jeux et définit une valeur
r
avec le type que vous souhaitez:Quel est le point de la définition de
ptrFromAddress
, qui semble comme il ne fait rien? Ma pensée est que la section de la Swift interop livre qui traite mutable pointeurs montre de nombreuses façons de les initialiser par le passage d'une expression comme argument (comme&x
), mais ne semble pas montrer les moyens correspondants, où il vous suffit d'appelerUnsafeMutablePointer
's initialiseur. Donc, nous allons définir un no-op de la fonction juste à utiliser ces méthodes d'initialisation basé sur l'argument de passage deMise à jour:
Même si je crois que la méthode ci-dessus est correcte, il a été souligné par @alisoftware dans un autre forum que cela semble être un moyen plus sûr et plus idiomatiques façon de faire la même chose:
C'est plus idiomatique parce que vous êtes à l'aide de la fonction
withUnsafeMutablePointer
qui est fourni par le Swift de la bibliothèque standard, plutôt que de définir votre propre helper. Il est plus sûr parce que vous avez la garantie que leUnsafeMutablePointer
est seulement vivant au cours de la mesure de l'appel à la fermeture (à condition que la fermeture elle-même ne pas stocker le pointeur).