的C结构功能自动桥接斯威夫特方法

问题描述 投票:3回答:1

是否有一个命名约定,让斯威夫特上与结构本身就是一个结构行动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功能?

c swift
1个回答
4
投票

斯威夫特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()'
© www.soinside.com 2019 - 2024. All rights reserved.