c, obj c enum без тега или идентификатора - PullRequest
0 голосов
/ 07 декабря 2011

я изучаю cocos2d [открыть оболочку gl для цели C на iPhone], и ​​теперь игра со спрайтами нашла это в примере

 enum {  
easySprite =   0x0000000a,
mediumSprite = 0x0000000b,
hardSprite =   0x0000000c,
backButton =   0x0000000d,
magneticSprite = 0x0000000e,
magneticSprite2 = 0x0000000f
};

...

 -(id) init
 {...
  /second sprite
    TSprite *med = [TSprite spriteWithFile:@"butonB.png"]; //blue
    [med SetCanTrack:YES];
    [self addChild: med z:1 tag:mediumSprite];
    med.position=ccp(299,230);
    [TSprite track:med];

поэтому переменная, определенная в перечислении, используется в имени тега созданного объекта спрайта,

но я не понимаю

  1. зачем давать значения в гекса тегам для использования
  2. перечисление без тегов

как я знал это перечисление в obj C и C

     typedef enum {
     JPG,
     PNG,
      GIF,
     PVR
     } kImageType;

спасибо!

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

Обычно, когда вы создаете перечисление, вы хотите использовать его как тип (переменная, параметры метода и т. Д.).

В данном случае это просто способ объявления целочисленных констант. Поскольку они не хотят использовать перечисление как тип, имя не обязательно.

Edit: Шестнадцатеричные числа обычно используются, когда целое число является двоичной маской. Вы не увидите операторов типа +, -, *, /, используемых с таким числом, вы увидите побитовые операторы (!, &, |, ^).

Каждая цифра в шестнадцатеричном числе представляет 4 бита. Целое число представляет собой 32-разрядное целое число, и в этом случае, записав его в шестнадцатеричном формате, вы говорите, что используете только последние четыре бита, а другие биты могут использоваться для чего-то другого. Это не было бы очевидно из десятичного числа.

2 голосов
/ 07 декабря 2011

Перечисления - это автоматически присваиваемые значения, с шагом 0, но вы можете присваивать свои собственные значения.

Если вы не укажете никаких значений, они будут начинаться с 0, как в:1005 * Но вы можете присвоить им значения:

typedef enum {
 JPG = 0,
 PNG = 1,
 GIF = 2,
 PVR = 3
 } kImageType;

или даже

typedef enum {
 JPG = 100,
 PNG = 0x01,
 GIF = 100,
 PVR = 0xff
 } kImageType;

все, что вы хотите, повторяющиеся значения тоже подойдут.

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

1 голос
/ 07 декабря 2011

Ну, вы, кажется, работаете на ужасном примере.:)

По крайней мере, что касается перечислений.Кто угодно может определить действительное значение записи enum, но нет смысла использовать шестнадцатеричные числа, и, в частности, нет смысла начинать шестнадцатеричные числа с a по f (от 10 до 15).Пример также будет работать с этим перечислением:

enum {  
easySprite = 10,
mediumSprite,
hardSprite,
backButton,
magneticSprite,
magneticSprite2
};

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

...