是否存在允许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函数?
发布于 2019-02-04 04:01:48
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()'https://stackoverflow.com/questions/54506743
复制相似问题