Hat Swift nicht mit Funktionszeigern?
Ich versuche, verwenden Sie eine C-Bibliothek, die in Swift, und ich habe Probleme beim aufrufen einer Funktion, die einen Funktionszeiger als eines seiner Argumente. Zum Beispiel, Teil des lua.h-Datei, die ich versuche, in der Swift sieht wie folgt aus:
LUA_API void (lua_setuservalue) (lua_State *L, int idx);
typedef int (*lua_CFunction) (lua_State *L);
LUA_API void (lua_callk) (lua_State *L, int nargs, int nresults, int ctx,
lua_CFunction k);
Ich den bridging-header, um Zugang zu der Bibliothek, und von meiner Swift-code, die ich anrufen kann lua_setuservalue ohne Probleme. Aber wenn ich versuche zu nennen, lua_callk bekomme ich "use of unresolved identifier 'lua_callk'". Wenn ich entfernen Sie den Funktionszeiger aus der Erklärung für lua_callk, ich nicht mehr diesen Fehler bekommen. Jede Hilfe wird sehr geschätzt.
- hier ist eine nützliche ref: stackoverflow.com/questions/36025632/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Apple hat Funktionszeiger verfügbar ab beta 3, aber Sie können nur referenziert werden nicht genannt.
Mit Swift mit Cocoa und Objective-C
Beta 3 Release Notes (PDF)
Diese Antwort bezieht sich auf eine frühere version des Swift-Sprache und kann nicht mehr zuverlässig.
Während die C-Funktion einen Zeiger nicht verfügbar in Swift, können Sie immer noch verwenden, swift-Verschlüsse, die übergeben werden, um C-Funktionen als Blöcke.
Tun so erfordert einige "shim" - Routinen in C zu nehmen, der block und wickeln Sie es in eine C-Funktion. Der folgende Code veranschaulicht, wie es funktioniert.
Swift:
C:
Natürlich, was Sie zu tun mit der Schließung, und wie Sie speichern und laden Sie Sie für die Verwendung ist bis zu Ihnen. Aber dies sollte Ihnen einen start.
In der Apple Dokumentation es wird darauf hingewiesen, dass
C function pointers are not imported in Swift
.Seit Swift 3.1 eine beliebige Adresse ein Funktionszeiger aufgerufen werden kann, wie diese:
Vorausgesetzt, für diese^ insbesondere call-Signatur: