从C调用Swift的最佳方式是什么?

n1bvdmb6  于 2023-03-22  发布在  Swift
关注(0)|答案(3)|浏览(163)

从Swift调用C非常简单,但是我正在考虑在C中制作一个双向 Package 器,所以我的C必须调用Swift函数。
现在,我可以通过在C中声明函数指针来做到这一点,并在Swift端设置它们以调用Swift中的代码之后,让我的C函数调用它们。
我的C头文件:

typedef void (*callback_t)(void);

void callBackIntoSwift( callback_t cb );

我的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" );
}

在桥接头文件中包含我的C头文件之后,我可以在Swift端执行以下操作:

let cb: callback_t = {
    someKindOfSwiftFunction()
}

callBackIntoSwift( cb )

或者甚至:

callBackIntoSwift {
    someKindOfSwiftFunction()
}

我想让C端直接调用someKindOfSwiftFunction ......但是当我尝试将@convention (c)应用于函数声明时,我得到的消息是该属性只能应用于类型,而不是声明。
Github中有什么想法或代码库可以让我看看吗?

yiytaume

yiytaume1#

根据Joe Groff
目前还没有正式的方法。除了名称篡改,Swift函数使用与C不同的调用约定。非官方的,如果你愿意处理比通常更多的代码中断和编译器错误,有一个非官方的属性@_cdecl可以做到这一点:

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

你可以从C:

#include <stdint.h>

intptr_t mymodule_foo(intptr_t);

intptr_t invoke_foo(intptr_t x) {
  return mymodule_foo(x);
}
pqwbnv8z

pqwbnv8z2#

你可以这样做:
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];
}
wbgh16ku

wbgh16ku3#

在C和Swift之间传递值
在C中

extern char *mySwiftFunction(char *valuefromc);
 int checkSwiftFuncation(void )
 {
        char  *retval = mySwiftFunction("samplevalue");
        printf("value %s\n",retval);
        return 0;
}

在斯威夫特

@_silgen_name("mySwiftFunction")  // vital for the function being visible from C
 func mySwiftFunction(valuefromc: UnsafePointer<Int8>) -> UnsafeMutablePointer<Int8>
{

    let value = String(cString: valuefromc, encoding: .utf8)
    print ("mySwiftFUnction called in Swift with \(value!)")
    let retmsg = "return message"
    return retmsg.charpointer
}


extension String {
    var charpointer: UnsafeMutablePointer<Int8> {
        return UnsafeMutablePointer(mutating: (self as NSString).utf8String!)
    }}

相关问题