На самом базовом уровне да, шаблоны - это просто замены макросов. Но вы пропустите много вещей, подумав об этом таким образом.
Рассмотрите специализированную специализацию, которая, насколько мне известно, вы не можете имитировать с помощью макросов. Это не только позволяет специальную реализацию для определенных типов, но и является одной из ключевых частей метапрограммирования шаблонов:
template
struct is_void
{
static const bool value = false;
}
template <>
struct is_void
{
static const bool value = true;
}
. Это само по себе является лишь одним из примеров многих вещей вы можете сделать . Шаблоны сами по себе являются Тьюрингом.
Это игнорирует самые основные вещи, такие как область действия, тип безопасности, и что макросы более беспорядочны.
Объявление 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 импортирует переменные как необязательные вместо (неявно развернутых).