Existe-t-il un moyen d'appeler des routines C depuis Swift?
De nombreuses bibliothèques iOS / Apple sont uniquement en C et j'aimerais toujours pouvoir les appeler.
Par exemple, j'aimerais pouvoir appeler les bibliothèques d'exécution objc depuis swift.
En particulier, comment reliez-vous les en-têtes iOS C?
Le compilateur convertit l'API C en Swift comme il le fait pour Objective-C.
Voir Interaction avec les API Objective-C dans la documentation.
la source
CFTypeRef
) sont convertis en objets Swift. Cependant, la plupart des fonctions ObjCRuntime.h ne sont pas significatives pour Swift.Juste au cas où vous êtes aussi nouveau que moi sur XCode et que vous souhaitez essayer les extraits publiés dans la réponse de Leandro :
la source
Cet article a également une bonne explication sur la façon de le faire en utilisant le support du module de clang .
Il est encadré en termes de comment faire cela pour le projet CommonCrypto, mais en général, cela devrait fonctionner pour toute autre bibliothèque C que vous souhaitez utiliser à partir de Swift.
J'ai brièvement expérimenté cette opération pour zlib. J'ai créé un nouveau projet de cadre iOS et créé un répertoire zlib, contenant un fichier module.modulemap avec les éléments suivants:
Ensuite, sous Targets -> Link Binary With Libraries, j'ai sélectionné ajouter des éléments et ajouté libz.tbd.
Vous voudrez peut-être construire à ce stade.
J'ai alors pu écrire le code suivant:
Vous n'êtes pas obligé de mettre le nom de la bibliothèque zlib devant, sauf dans le cas ci-dessus, j'ai nommé la fonction de classe Swift de la même manière que la fonction C, et sans la qualification, la fonction Swift finit par être appelée à plusieurs reprises jusqu'à ce que l'application s'arrête.
la source
Dans le cas de C ++, il y a cette erreur qui apparaît:
Vous avez également besoin d'un fichier d'en-tête C ++. Ajoutez c-linkage à votre fonction, puis incluez le fichier d'en-tête dans l'en-tête du pont:
Swift 3
UserInput.h
UserInput.c
main.swift
cliinput-Bridging-Header.h
Voici la vidéo originale expliquant cela
la source
__OBJC
chèque à votre en-tête de pont, par exemple#ifdef __OBJC @import UIKit; #endif
Il semble que ce soit une boule de cire assez différente lorsqu'il s'agit de pointeurs. Voici ce que j'ai jusqu'à présent pour appeler l'
read
appel système C POSIX :la source