Funktioniert Swift nicht mit Funktionszeigern?

8

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.

    
Mike 06.06.2014, 18:19
quelle

3 Antworten

10

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 CFunctionPointer<Type> importiert, wobei Type a ist   Schneller Funktionstyp. Zum Beispiel ein Funktionszeiger, der den Typ int (*)(void) in C hat   wird in Swift als CFunctionPointer<() -> Int32>

importiert

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.

    
TiLogic 23.07.2014, 17:43
quelle
15

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.

    
Jim Hayes 09.06.2014 04:18
quelle
2

Im Apple Dokumentation wird darauf hingewiesen, dass C function pointers are not imported in Swift .

    
Antarr Byrd 06.06.2014 21:02
quelle

Tags und Links