首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C结构函数到Swift方法的自动桥接

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

Stack Overflow用户
提问于 2019-02-04 03:33:54
回答 1查看 98关注 0票数 3

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

例如,CGRect声明如下:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
let rect = CGRect()
let minX = rect.minX

我试图复制相同的代码,希望能从我自己的C结构中获得相同的行为,但似乎无法让它正常工作。

这种自动行为到底是由于结构的声明方式造成的,还是通过扩展/其他魔法添加到其他地方的?如果是通过扩展,你如何在Swift中禁止原始的CGRectGetMinX函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-04 04:01:48

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

下面是一个简单的示例,您可以将其用于您自己的结构类型:

代码语言:javascript
复制
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调用它,如下所示

代码语言:javascript
复制
let rect = MyRect()
let mx = rect.minX
let ar = rect.area()

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

代码语言:javascript
复制
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()'
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54506743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档