我可以在C中定义没有参数的构造函数吗?

时间:2017-05-17 18:26:31

标签: swift

我有一个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 *。

1 个答案:

答案 0 :(得分:2)

对于从C导入的结构,编译器会创建一个init()初始化程序,它不接受任何参数并将所有成员设置为零。例如

__attribute((swift_name("Test")))
typedef struct {
    int a;
} test_t;

的形式导入Swift
public 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)