2016-01-30 15 views
8

Wywołanie C z Swift jest całkiem proste, ale ja zajmuję się tworzeniem dwukierunkowego opakowania w C, więc mój C musi wywoływać funkcje Swift.Jaki jest najlepszy sposób wywołania Swift z C?

W tej chwili mogę to zrobić, deklarując wskaźniki funkcyjne w C, i mając moje funkcje C, zadzwoń do nich po stronie Swift skonfigurował je, aby wywołać kod w Swift.

Mój plik C nagłówka:

typedef void (*callback_t)(void); 

void callBackIntoSwift(callback_t cb); 

Mój plik implementacja C:

#include "stuff.h" 
#include <stdio.h> 

void callBackIntoSwift(callback_t cb) 
{ 
    printf("Will call back into Swift\n"); 
    cb(); 
    printf("Did call back into Swift\n"); 
} 

Po tym mój plik nagłówka C w nagłówku pomostowego, mogę wykonać następujące czynności na Swift strony:

let cb: callback_t = { 
    someKindOfSwiftFunction() 
} 

callBackIntoSwift(cb) 

Albo nawet:

callBackIntoSwift { 
    someKindOfSwiftFunction() 
} 

Czy istnieje lepszy sposób, aby to zrobić, gdy wskaźniki funkcji i wywołania zwrotne nie są potrzebne? Chciałbym bezpośrednio wywołać wywołanie po stronie C: someKindOfSwiftFunction ... ale kiedy próbuję zastosować @convention (c) do deklaracji funkcji, otrzymuję komunikat, że atrybut może być zastosowany tylko do typów, a nie deklaracji.

Wszelkie pomysły lub bazy kodów w np. Github Mogę rzucić okiem?

Odpowiedz

0

można zrobić coś takiego:

FileSwift.swift

public class SwiftTest: NSObject { 
    @objc public static func testMethod() { 
     print("Test") 
    } 
} 

FileSwiftWrapper.h

void SwiftFunctionWrapper(); 

FileSwiftWrapper.m

#import "ProductModuleName-Swift.h" 

void SwiftFunctionWrapper() { 
     [SwiftTest testMethod]; 
} 
+1

OP poprosił o wywołanie funkcji C w szybki, a nie jak się nazywają Objective-C metoda – pbush25

+0

Autor chce zadzwonić Swif t kod z C. "Wywołanie C z Swift jest całkiem proste, ale zajmuję się tworzeniem dwukierunkowego opakowania w C, więc mój C musi wywoływać funkcje Swift." @ Pbush25 – Rolan

+0

Prawdopodobnie mogę rozszerzyć mój komentarz. Funkcję 'SwiftFunctionWrapper()' można wywołać z dowolnego pliku c. – Rolan

1

Według Joe Groff:

Nie ma jeszcze oficjalnej drogi. Oprócz wymazywania nazw, funkcje Swiftu używają innej konwencji wywoływania od C. Nieoficjalnie, jeśli chcesz poradzić sobie z większymi niż zwykle ilościami błędów kodu i kompilatora, istnieje nieoficjalny atrybut @_cdecl, który to robi:

@_cdecl("mymodule_foo") 
func foo(x: Int) -> Int { 
    return x * 2 
} 

które można następnie połączyć z C:

#include <stdint.h> 

intptr_t mymodule_foo(intptr_t); 

intptr_t invoke_foo(intptr_t x) { 
    return mymodule_foo(x); 
} 
+1

Mimo, że ta odpowiedź jest prawidłowa, miałem pewne problemy z doprowadzeniem rzeczy do działania. [Właśnie dlatego zrobiłem mały artykuł] (https://gist.github.com/HiImJulien/c79f07a8a619431b88ea33cca51de787). – Julien

Powiązane problemy