Gibt es eine Möglichkeit, C-Routinen von Swift aus aufzurufen?
Viele iOS / Apple-Bibliotheken sind nur C und ich würde diese immer noch gerne aufrufen können.
Zum Beispiel möchte ich die objc-Laufzeitbibliotheken von Swift aufrufen können.
Wie überbrücken Sie insbesondere iOS C-Header?
Leandros
Ja, Sie können natürlich mit den C-Bibliotheken von Apple interagieren. Hier wird erklärt wie.
Grundsätzlich werden die C-Typen, C-Zeiger usw. in Swift-Objekte übersetzt, beispielsweise ein C int in Swift ist a CInt.
Ich habe ein winziges Beispiel für eine andere Frage erstellt, die als kleine Erklärung verwendet werden kann, wie man eine Brücke zwischen C und Swift herstellt:
main.swift
import Foundation
var output: CInt = 0
getInput(&output)
println(output)
Ich bin neu bei ios/swift. Ich möchte die Protokollierungs-C-Funktion von #include in Swift-Dateien verwenden. Jeder?
– Dmitri Konovalov
1. November 2014 um 0:30 Uhr
ist es kompatibel mit C++, .cpp-Dateien?
– Carlos V
12. November 2016 um 3:29 Uhr
Um C++-Dateien direkt zu verwenden, sollten Sie einen Objective-C-Wrapper erstellen. Sie möchten, dass die Implementierung (die sich selbst in einer .mm-Datei befinden sollte) Objective-C++-Code (der nur Objective-C und C++ in einer Datei enthält) und die Schnittstelle (die sich in einer eigenen .h-Datei befinden sollte) enthalten Header-Datei) sollte reinen Objective-C-Code enthalten, daher müssen Sie C++-Typen in der Implementierung in Objective-C-Typen konvertieren, um sie für Swift verfügbar zu machen. Dann können Sie diesen Header mit einem Objective-C-Bridging-Header importieren.
– William T. Froggard
6. Dezember 2016 um 1:23 Uhr
„Sie können natürlich mit Apples C-Bibliotheken interagieren“ Falsch. Sie können mit interagieren irgendein C-Bibliotheken, die überhaupt nicht auf Apples beschränkt sind.
Danke für das Beispiel, und du hast Recht, ich kann sehen, wie das funktionieren könnte. Es beantwortet jedoch nicht wirklich meine Frage, wie Apple C-Bibliotheken aufgerufen werden sollen. Aber es ist definitiv am nächsten.
– Feuer
2. Juni 2014 um 23:27 Uhr
Schauen Sie an anderer Stelle in diesem Dokument nach. Zum Beispiel “Objekte” im CoreFoundation-Stil (CFTypeRef) werden in Swift-Objekte konvertiert. Die meisten der ObjCRuntime.h-Funktionen sind für Swift jedoch nicht von Bedeutung.
– Rickster
2. Juni 2014 um 23:29 Uhr
“Die meisten Funktionen von ObjCRuntime.h sind für Swift jedoch nicht von Bedeutung.” Warum sagen Sie das? Ich denke, ich muss einen Weg finden, einen Header zu importieren und ihn zu überbrücken. Das scheint umständlich, aber ich denke, es ist der richtige Weg.
– Feuer
2. Juni 2014 um 23:34 Uhr
Lukas83
Nur für den Fall, dass Sie so neu bei XCode sind wie ich und die in Leandros Antwort geposteten Snippets ausprobieren möchten:
Datei->Neu->Projekt
Wählen Sie das Befehlszeilentool als Projektvoreinstellung und nennen Sie das Projekt “cliinput”.
Klicken Sie mit der rechten Maustaste in den Projektnavigator (das blaue Feld auf der linken Seite) und wählen Sie “Neue Datei …”
Benennen Sie im Dropdown-Dialog die Datei “UserInput”. Deaktivieren Sie das Kontrollkästchen “Auch eine Header-Datei erstellen”. Sobald Sie auf „Weiter“ klicken, werden Sie gefragt, ob XCode die Bridging-Header.h-Datei für Sie erstellen soll. Wählen Sie „Ja“.
Kopieren Sie den Code aus Leandros Antwort oben und fügen Sie ihn ein. Sobald Sie auf die Wiedergabeschaltfläche klicken, sollte sie im Terminal kompiliert und ausgeführt werden, das in xcode im unteren Bereich integriert ist. Wenn Sie im Terminal eine Nummer eingeben, wird eine Nummer zurückgegeben.
julianisch
Dieser Beitrag enthält auch eine gute Erklärung dazu, wie man dies mit Clangs macht Modulunterstützung.
Es ist darauf ausgelegt, wie dies für das CommonCrypto-Projekt zu tun ist, aber im Allgemeinen sollte es für jede andere C-Bibliothek funktionieren, die Sie in Swift verwenden möchten.
Ich habe kurz damit experimentiert, dies für zlib zu tun. Ich habe ein neues iOS-Framework-Projekt erstellt und ein Verzeichnis zlib erstellt, das eine module.modulemap-Datei mit Folgendem enthält:
Dann habe ich unter Targets -> Link Binary With Libraries die Option add items ausgewählt und libz.tbd hinzugefügt.
Vielleicht möchten Sie an dieser Stelle bauen.
Ich konnte dann folgenden Code schreiben:
import zlib
public class Zlib {
public class func zlibCompileFlags() -> UInt {
return zlib.zlibCompileFlags()
}
}
Du nicht haben um den Namen der zlib-Bibliothek voranzustellen, außer dass ich im obigen Fall die Swift-Klassenfunktion genauso benannt habe wie die C-Funktion, und ohne die Qualifikation wird die Swift-Funktion wiederholt aufgerufen, bis die Anwendung anhält.
John James
Im Fall von c++ gibt es diesen Fehler, der auftaucht:
"_getInput", referenced from:
Sie benötigen auch eine C++-Header-Datei. Fügen Sie Ihrer Funktion c-linkage hinzu und fügen Sie dann die Header-Datei in den Bridge-Header ein: