Ich versuche, in Swift eine C-Bibliothek zu verwenden, und ich habe Probleme, jede Funktion aufzurufen, die einen Funktionszeiger als eines ihrer Argumente nimmt. Zum Beispiel sieht ein Teil der lua.h-Datei, die ich in Swift verwenden möchte, so aus:
%Vor%Ich verwende den Bridging-Header, um Zugriff auf die Bibliothek zu erhalten, und aus meinem Swift-Code kann ich lua_setuservalue ohne Probleme aufrufen. Aber wenn ich versuche, lua_callk aufzurufen, bekomme ich "den nicht aufgelösten Bezeichner 'lua_callk'". Wenn ich den Funktionszeiger aus der Deklaration für lua_callk entferne, erhalte ich diesen Fehler nicht mehr. Jede Hilfe wird sehr geschätzt.
Apple hat Funktionszeiger ab Beta 3 verfügbar gemacht, sie können jedoch nur referenziert werden, nicht aufgerufen.
Swift mit Kakao und Objective-C verwenden
Funktionszeiger
C-Funktionszeiger werden in Swift als
importiertCFunctionPointer<Type>
importiert, wobeiType
a ist Schneller Funktionstyp. Zum Beispiel ein Funktionszeiger, der den Typint (*)(void)
in C hat wird in Swift alsCFunctionPointer<() -> Int32>
Beta 3 Release Notes (PDF)
Funktionszeiger werden jetzt ebenfalls importiert und können referenziert und weitergegeben werden. Jedoch, Sie können keinen C-Funktionszeiger aufrufen oder eine Schließung in den C-Funktionszeigertyp konvertieren.
Diese Antwort bezieht sich auf eine frühere Version der Swift-Sprache und ist möglicherweise nicht mehr zuverlässig.
Während C-Funktionszeiger in Swift nicht sind, können Sie weiterhin swift-Closures verwenden, die als Block an C-Funktionen übergeben werden.
Dies erfordert ein paar "Shim" -Routinen in C, um den Block zu übernehmen und in eine C-Funktion umzuwandeln. Im Folgenden wird gezeigt, wie es funktioniert.
Schnell:
%Vor%C:
%Vor%Natürlich entscheiden Sie, was Sie mit der Schließung tun, und wie Sie sie speichern und zur Verwendung zurückrufen, bleibt Ihnen überlassen. Aber das sollte dir einen Anfang geben.
Im Apple Dokumentation wird darauf hingewiesen, dass C function pointers are not imported in Swift
.