Behandeln Sie Swift-Funktionen und -Verschlüsse als Zeiger für C-Sprachfunktionen

Überblick

Letztes Mal hat geschrieben, wie eine Swift-Funktion von C aufgerufen wird, aber es ist mühsam, einen separaten Header namens "swift.h" vorzubereiten. Das Attribut [^ 1] `@ _silgen_name (" ... ") riecht jedoch auch verdächtig und ... Es gibt also auch eine Möglichkeit, Swift-Funktionen und -Verschlüsse als C-Sprachfunktionszeiger zu verarbeiten. Es gibt, also werde ich es schreiben.

[^ 1]: Für kleine Projekte können Sie einfach einen Funktionsprototyp in c.c schreiben ... richtig?

einpacken

  1. Verwenden Sie "@convention (c)".
  2. Das war's (Sie müssen diesen Artikel nicht lesen, wenn Sie das verstehen)

Umgebung

OS X


$ clang --version
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ swift --version
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
Target: x86_64-apple-macosx10.9

Linux


$ clang --version
clang version 3.8.0 (tags/RELEASE_380/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin

$ swift --version
Swift version 2.2.1 (swift-2.2.1-RELEASE)
Target: x86_64-unknown-linux-gnu

Quelldatei

Wie die letzten beiden Male gibt es nur drei Dateien.

$ ls
c.c  c.h  swift.swift

c.h


#include <unistd.h>
void call_me_later(void (*closure)(), unsigned int seconds);

c.c


#include "c.h"
void call_me_later(void (*closure)(), unsigned int seconds) {
  sleep(seconds);
  closure();
}

swift.swift


func swift_function() {
  print("I just woke up! Yes, I'm Function.")
}
let swift_closure:@convention(c) ()->() = {
  print("I just woke up! Uh-oh, I'm Closure.")
}
call_me_later(swift_function, 0)
call_me_later(swift_closure, 2)

Kompilierungsverfahren

Erstellen Sie eine Objektdatei aus einer C-Sprachquelle

OS&#x0020;X,&#x0020;Gemeinsam für Linux


$ clang -c c.c -oc.o
$ ls
c.c  c.h  c.o  swift.swift

Kompilieren Sie die Swift-Quelle mit der Objektdatei

OS&#x0020;X


$ xcrun --sdk macosx swiftc swift.swift c.o -import-objc-header c.h
ld: warning: object file (c.o) was built for newer OSX version (10.11) than being linked (10.9)
$ ls
c.c		c.h		c.o		main		swift.swift
$ ./main
I just woke up! Yes, I'm Funtion.
I just woke up! Uh-oh, I'm Closure.

Linux


$ swiftc swift.swift c.o -import-objc-header c.h
$ ls
c.c  c.h  c.o  main  swift.swift
$ ./main
I just woke up! Yes, I'm Funtion.
I just woke up! Uh-oh, I'm Closure.

erledigt. Das ist das Ende. Es ist einfach [^ 2]?

[^ 2]: Wenn Sie googeln Es scheint verschiedene Anwendungen zu geben.

Recommended Posts

Behandeln Sie Swift-Funktionen und -Verschlüsse als Zeiger für C-Sprachfunktionen
Rufen Sie C-Sprachfunktionen von Swift aus auf
Einführung in Zeichen und Zeichenfolgen in C-Sprache für Swift Programmer
C-Makro für watchOS und Swift API Availability
C-Makro für die Verfügbarkeit von tvOS und Swift API
Behandeln Sie Zeiger wie UnsafePointer <T> in Swift