自动将C结构函数桥接到Swift方法

时间:2019-02-03 19:33:54

标签: c swift

是否存在一种命名约定,该约定将允许Swift自动将对结构起作用的C函数与该结构本身相关联?

例如,CGRect声明如下:

struct CGRect {
    CGPoint origin;
    CGSize size;
};
typedef struct CG_BOXABLE CGRect CGRect;

...

CG_EXTERN CGFloat CGRectGetMinX(CGRect rect)
    CG_AVAILABLE_STARTING(10.0, 2.0);

但是我可以这样编写Swift代码:

let rect = CGRect()
let minX = rect.minX

我试图复制相同的内容,希望可以从自己的C结构中获得相同的行为,但是似乎无法使其正常工作。

此自动行为是由于该结构的声明方式完全相同,还是通过扩展名/其他魔术将其添加到其他位置? 如果是通过扩展名,那么如何禁止Swift中原始的CGRectGetMinX函数呢?

1 个答案:

答案 0 :(得分:4)

Swift 3引入了将全局函数作为成员函数导入的功能,请参见 SE-0044 Import as member

这是一个简单的示例,如何将其用于自己的结构类型:

typedef struct MyRect {
    int x;
    int y;
    int w;
    int h;
} MyRect;

// Import as computed property:
int MyRectGetMinX(MyRect rect)
__attribute__((swift_name("getter:MyRect.minX(self:)")));

// Import as method:
int MyRectArea(MyRect rect)
__attribute__((swift_name("MyRect.area(self:)")));

现在您可以从Swift调用它为

let rect = MyRect()
let mx = rect.minX
let ar = rect.area()

并且使用全局函数无法编译:

let mx = MyRectGetMinX(rect)
// Error: 'MyRectGetMinX' has been replaced by property 'MyRect.minX'

let ar = MyRectArea(rect)
// Error: 'MyRectArea' has been replaced by instance method 'MyRect.area()'