Swift: доступ к членам структуры C, которые являются объектами

На самом базовом уровне да, шаблоны - это просто замены макросов. Но вы пропустите много вещей, подумав об этом таким образом.

Рассмотрите специализированную специализацию, которая, насколько мне известно, вы не можете имитировать с помощью макросов. Это не только позволяет специальную реализацию для определенных типов, но и является одной из ключевых частей метапрограммирования шаблонов:

template 
struct is_void
{
    static const bool value = false;
}

template <>
struct is_void
{
    static const bool value = true;
}

. Это само по себе является лишь одним из примеров многих вещей вы можете сделать . Шаблоны сами по себе являются Тьюрингом.

Это игнорирует самые основные вещи, такие как область действия, тип безопасности, и что макросы более беспорядочны.

1
задан Bryan 2 March 2019 в 02:56
поделиться

1 ответ

Объявление C

extern struct MYColors * appColors;

импортируется в Swift как

public var appColors: UnsafeMutablePointer<MYColors>!

Разыменование указателя выполняется в Swift через свойство pointee, поэтому Swift эквивалентно ( Objective-) C-код

appColors->appBackgroundColor

-

appColors.pointee.appBackgroundColor

Тип этого значения - Unmanaged<CGColor>!, поскольку компилятор Swift не знает, как следует управлять памятью объекта. В вашем случае вызывающая сторона не несет ответственности за освобождение объекта, поэтому окончательный код:

let bgColor = appColors.pointee.appBackgroundColor.takeUnretainedValue()

Для получения дополнительной информации о неуправляемых ссылках см. Unmanaged .

Примечание: Если appColors и все члены структуры гарантированно не равны NULL при доступе, вы можете пометить их с помощью _Nonnull в интерфейсе:

struct MYColors {
    CGColorRef _Nonnull appBackgroundColor;
    // ...
};

extern struct MYColors * _Nonnull appColors;

Затем компилятор Swift импортирует переменные как необязательные вместо (неявно развернутых).

0
ответ дан Martin R 2 March 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: