Автоматическое связывание структурных функций C с методами Swift - PullRequest
0 голосов
/ 03 февраля 2019

Существует ли соглашение об именах, которое позволит 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

Я пытался скопировать то же самое в надежде, что смогу получить то же поведение из своих собственных структур Си, но, похоже, не могуэто работает правильно.

Это автоматическое поведение связано именно с тем, как именно объявляется структура, или оно добавляется в другом месте с помощью расширений / какой-то другой магии?Если это через расширения, как запретить оригинальную функцию CGRectGetMinX в Swift?

1 Ответ

0 голосов
/ 03 февраля 2019

Swift 3 представил функцию для импорта глобальных функций как функций-членов, см. SE-0044 Импорт в качестве члена .

Вот простой пример того, как вы можете использовать это для своей собственной структурытипы:

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()'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...