简单无杂乱的方式来调用多个变量

时间:2011-05-18 15:03:19

标签: objective-c variables call clutter

我正在寻找像

这样的事情
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 个答案:

答案 0 :(得分:3)

您正在尝试使用错误的数据结构。枚举只是可能值的列表,数据类型而不是变量。

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 :(得分:1)

枚举值是常量,因此无法修改它们。 Objective-c是一种基于c的语言,因此ItemNames不是一个对象,它是一种类型。

答案 2 :(得分:1)

我发现很难绕过你的问题。你确定你知道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

希望这有帮助。