是否存在一种命名约定,该约定将允许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
函数呢?
答案 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()'