我有
enum Colour {
white,
pink,
yellow,
blue
} Colour;
我想做这样的事情:
for (int colour in Colour){
// Do something here.
}
我可以这样做,如果是,怎么做?谢谢你的帮助!
答案 0 :(得分:150)
虽然问题已经回答,但这是我的两分钱:
enum Colour {
white = 0,
pink,
yellow,
blue,
colorsCount // since we count from 0, this number will be blue+1 and will be actual 'colors count'
} Colour;
for (int i = 0; i < colorsCount; ++i)
someFunc((Colour)i);
我想这并不是那么糟糕,并且非常接近你想要的快速枚举。
答案 1 :(得分:18)
枚举来自C,而快速枚举是Objective-C 2.0的补充..它们不能一起工作。
Type existingItem;
for ( existingItem in expression ) { statements }
表达式必须符合NSFastEnumeration协议并且是一个对象!枚举的“元素”不是对象。
请参阅此链接以获取更多信息Apple's Fast Enumeration Documents
检查此示例以查看枚举的工作速度:
NSArray *array = [NSArray arrayWithObjects:
@"One", @"Two", @"Three", @"Four", nil];
for (NSString *element in array) {
NSLog(@"element: %@", element);
}
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
@"quattuor", @"four", @"quinque", @"five", @"sex", @"six", nil];
NSString *key;
for (key in dictionary) {
NSLog(@"English: %@, Latin: %@", key, [dictionary objectForKey:key]);
}
答案 2 :(得分:13)
switch
语句中找到“并非所有开关案例都被处理”。也许更好的方法是为第一个和最后一个元素使用别名:
enum Colour {
firstColour = 0,
white = firstColour,
pink,
yellow,
blue,
lastColour = blue
} Colour;
for (int i = firstColour; i <= lastColour; ++i) {
}
答案 3 :(得分:6)
我也来这篇文章回答这个问题。 Gobra的答案很棒。但是我的项目数量可能会波动,并且与存储的值相关联,所以为了更加安全,“colorsCount”计数是或从来不是有效值,我最终实现了以下内容并希望添加到讨论中:
MYColor.h
typedef NS_ENUM( NSInteger, MYColorType )
{
MYColorType0 = 0,
MYColorType1,
MYColorType2,
MYColorType3
};
static inline MYColorType MYColorTypeFirst() { return MYColorType0; }
static inline MYColorType MYColorTypeLast() { return MYColorType3; }
ViewController.m
for ( int i = MYColorTypeFirst(); i <= MYColorTypeLast(); i++ )
{
MYColor * color = [[MYColor alloc] initWithType:i];
...
}
值得注意的是MYColorTypeFirst()和MYColorTypeLast()的定义,它在for()迭代中使用,放置在枚举定义附近以便于维护。
答案 4 :(得分:4)
如果我不是enum的作者,我会这样做。我认为这是非常安全的,因为它并不关心枚举类型的实际实现方式。
UISwipeGestureRecognizerDirection allDirections[] = {
UISwipeGestureRecognizerDirectionDown,
UISwipeGestureRecognizerDirectionLeft,
UISwipeGestureRecognizerDirectionRight,
UISwipeGestureRecognizerDirectionUp
};
for (int i = 0; i < sizeof(allDirections)/sizeof(allDirections[0]); ++i) {
UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(onSwipe:)];
swipeGesture.direction = allDirections[i];
[self addGestureRecognizer:swipeGesture];
}
答案 5 :(得分:0)
在您的.h中:
typedef NS_ENUM(NSUInteger, EnumValue)
{
EnumValueOne,
EnumValueTwo,
EnumValueThree,
EnumValueFour
#define EnumValueLast EnumValueFour
};
应用程序中的其他位置:
for (EnumValue value = 0; value <= EnumValueLast; value++) {
//do stuff
}