我有一个C代码:
static __inline__ __attribute__((__always_inline__))
__attribute((swift_name("Test.init()")))
test_t test_init(void) { /* ... */ }
测试Swift代码:
let test = Test()
代码已编译,但函数 test_init 未调用。
如果我添加测试参数并与他调用init,则调用我的方法* test_init *。
答案 0 :(得分:2)
对于从C导入的结构,编译器会创建一个init()
初始化程序,它不接受任何参数并将所有成员设置为零。例如
__attribute((swift_name("Test")))
typedef struct {
int a;
} test_t;
以
的形式导入Swiftpublic struct Test {
public var a: Int32
public init()
public init(a: Int32)
}
可以在Xcode中看到“导航 - >跳转到生成的界面”。
您可以在C中创建其他init方法,但不能替换 现有的init方法。 (有人可能会说,编译器应该至少警告 Swift中将忽略Swift名称为“Test.init()”的C函数,因此您可以考虑提交错误报告。)
如果要在C中定义另一个不带参数的init方法
然后你必须给它一个虚假的Void
参数:
__attribute((swift_name("Test.init(v:)")))
static __inline__ __attribute__((__always_inline__))
test_t test_init(void) {
test_t t = { 3 };
return t;
}
并将其命名为
let test = Test(v: ())
print(test) // Test(a: 3)