是否有一个命名约定,让斯威夫特上与结构本身就是一个结构行动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);
但是,我可以写斯威夫特这样的代码:
let rect = CGRect()
let minX = rect.minX
我已经尝试复制,希望我可以从我自己的C结构相同的行为是相同的,但似乎无法得到它的正常工作。
这是自动的行为,由于结构究竟是如何声明,或者是通过扩展/其他一些神奇的其他地方添加?如果通过扩展的,你怎么禁止在雨燕原有CGRectGetMinX
功能?
斯威夫特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:)")));
现在,您可以从斯威夫特称呼其为
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()'