Xcode 5.0.1 на Mavericks: как избавиться от этого предупреждения?

У меня есть фрагмент кода, который создает маску, используя альфа-канал изображения. До обновления до Mavericks все работало отлично, и я никогда не получал ни одного предупреждения или ошибки в консоли отладки Xcode. После обновления я получаю это предупреждение:

Неявное преобразование из типа перечисления "enum CGImageAlphaInfo" в другой тип перечисления "CGBitmapInfo" (он же "enum CGBitmapInfo")

Строка, помеченная как проблема:

CGBitmapContextCreate(alphaData, width, height, 8, rowBytes, NULL, kCGImageAlphaOnly);

Вот что говорится в документации для последнего аргумента (также известного как kCGImageAlphaOnly):

bitmapInfo

Константы, которые указывают, должно ли растровое изображение содержать альфа-канал, относительное расположение альфа-канала в пикселе и информацию о том, являются ли компоненты пикселя значениями с плавающей запятой или целыми числами. Константы для указания информации об альфа-канале объявлены с типом CGImageAlphaInfo, но их можно безопасно передавать в этот параметр. Вы также можете передать другие константы, связанные с типом CGBitmapInfo.

Как ни странно, в документации (Альфа-информация для изображений), в typedef Apple не указан вариант, который я использую. Однако в следующем списке терминов это так! Вот что он говорит:

kCGImageAlphaOnly
Данных о цвете нет, только альфа-канал. Доступно в OS X v10.3 и более поздних версиях. Заявлено в CGImage.h.

Учитывая, что я хочу создать альфа-маску, меня не интересуют никакие данные о цвете, поэтому аргумент, который я использую, — единственный, который имеет смысл. Я не уверен, что он хочет, чтобы я сделал. Несмотря на это, метод работает, и все хорошо, когда приложение работает. С учетом сказанного, предупреждения действительно раздражают. Есть ли специальная директива CLANG, чтобы заставить его замолчать? Любая помощь будет оценена по достоинству. Ваше здоровье.


person Ben Stock    schedule 28.10.2013    source источник


Ответы (1)


Проблема в том, что вы заставляете компилятор выполнять неявное преобразование. Исправление состоит в том, чтобы сделать преобразование явным с помощью приведения:

CGBitmapContextCreate(alphaData, width, height, 8, rowBytes, NULL, (CGBitmapInfo)kCGImageAlphaOnly);

Тот факт, что функция реализована так, чтобы допускать значения нескольких типов для заданного параметра (как указано в документации), не означает, что ее можно определить так, что компилятор не будет жаловаться на это. C не позволяет вам определить параметр как принимающий несколько типов, вы должны выбрать один. В этом случае CGBitmapContextCreate определяется как:

CGContextRef CGBitmapContextCreate (
  void *data,
  size_t width,
  size_t height,
  size_t bitsPerComponent,
  size_t bytesPerRow,
  CGColorSpaceRef colorspace,
  CGBitmapInfo bitmapInfo
);

Обратите внимание на тип CGBitmapInfo внизу. Это означает, что даже если значения CGImageAlphaInfo технически допустимы, их все равно нужно преобразовать, чтобы пройти проверку типов.

person jemmons    schedule 28.10.2013
comment
Я даже не думал этого делать. Я не очень умный. Спасибо, мужик. Есть идеи, почему он не жаловался перед Mavericks? Я новичок в игре Xcode, поэтому я предполагаю, что все мои настройки останутся такими же, как и до Mavericks. Правильно? :-) Я полагаю, компилятор просто расширяет свою конверсионную игру, а? В любом случае, спасибо за быстрое решение. - person Ben Stock; 28.10.2013
comment
@BenStock Проблема не имеет ничего общего с Mavericks. Это проблема компилятора. Люди видели эту проблему с более ранними версиями Xcode. Какую версию Xcode вы использовали до перехода на Mavericks? - person rmaddy; 28.10.2013
comment
Да, это не Маверикс. Такая проверка всегда была доступна при использовании LLVM/CLANG (хотя я не уверен, включена ли она по умолчанию или нет). Если вы не видели этого раньше и видите сейчас, скорее всего, вы либо только что переключились на LLVM/CLANG, либо по какой-то причине была включена опция неявных преобразований Enum в настройках сборки. - person jemmons; 28.10.2013
comment
@jemmons: Я так и думал. С каждым обновлением вас ждет новый сюрприз! Спасибо за помощь. Если я когда-нибудь выпущу свое приложение, вы будете перечислены в разделе «Задиры» в окне «О программе». :-) - person Ben Stock; 29.10.2013
comment
@rmaddy: я использовал версию с iOS-подобным стилем и тестовыми ботами, так что я предполагаю… Xcode 5.0.0? Сейчас это почти то же самое, но я заметил, что средство просмотра документации немного изменилось. Странный. - person Ben Stock; 29.10.2013