Простой, свободный от помех способ вызова нескольких переменных - PullRequest
1 голос
/ 18 мая 2011

Я хочу сделать что-то вроде

int ItemNames;
typedef enum ItemNames {apple, club, vial} ItemNames;    
+(BOOL)GetInventoryItems{return ItemNames;}
apple=1; //Compiler Error.

Проблема в том, что я не могу установить переменную в перечислении на новое значение. Компилятор говорит мне, что я «объявил» целое число в перечислении. Кроме того, он не будет правильно возвращать значения. Поэтому вместо этого я должен использовать оператор if для каждого элемента, чтобы проверить, существует ли он следующим образом.

+ (void)GetInventoryItems
{
    if (apple <= 1){NSLog(@"Player has apple");}
    if (club <= 1){ NSLog(@"Player has club");}
    if (vial <= 1){NSLog(@"Player has vial");}
    if (apple == 0 && club == 0 && vial == 0){NSLog(@"Player's Inventory is Empty.");}
}

Есть ли обходной путь?

Ответы [ 3 ]

3 голосов
/ 18 мая 2011

Вы пытаетесь использовать неправильную структуру данных. Перечисление - это просто список возможных значений, тип данных, а не переменная.

typedef struct {
  int apple : 1;
  int club : 1;
  int vial : 1;
}
inventory_type;

inventory_type room;

room.apple = 1;

if (room.apple) NSLog (@"There's an apple");
if (room.club) NSLg (@"There's a club!");

Двоеточие и число после каждого элемента typedef указывает компилятору, сколько бит использовать, поэтому в этом случае доступен один бит (т. Е. Двоичное значение).

1 голос
/ 18 мая 2011

Мне трудно обернуть голову вокруг твоего вопроса.Вы уверены, что знаете, как enum работает в C?Это просто способ удобно объявлять числовые константы.Например:

enum { Foo, Bar, Baz };

Это что-то вроде:

static const NSUInteger Foo = 0;
static const NSUInteger Bar = 1;
static const NSUInteger Baz = 2;

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

enum {
    Apple  = 1 << 1,
    Banana = 1 << 2,
    Orange = 1 << 3
};

NSUInteger inventory = 0;

BOOL hasApple  = (inventory & Apple);
BOOL hasBanana = (inventory & Banana);

inventory = inventory | Apple; // adds an Apple into the inventory

Надеюсь, это поможет.

1 голос
/ 18 мая 2011

Перечисляемые значения являются константами, поэтому их нельзя изменить. Objective-c - это язык на основе c, поэтому ItemNames - это не объект, а тип.

...