У меня
enum Colour {
white,
pink,
yellow,
blue
} Colour;
и я хотел бы сделать что-то вроде этого:
for (int colour in Colour){
// Do something here.
}
Могу ли я сделать это, и если да, то как? Спасибо за вашу помощь!
У меня
enum Colour {
white,
pink,
yellow,
blue
} Colour;
и я хотел бы сделать что-то вроде этого:
for (int colour in Colour){
// Do something here.
}
Могу ли я сделать это, и если да, то как? Спасибо за вашу помощь!
перечисление происходит от C, в то время как быстрое перечисление было добавлением Objective-C 2.0.. они не работают вместе.
Type existingItem;
for ( existingItem in expression ) { statements }
выражение должно соответствовать протоколу NSFastEnumeration и быть объектом! "элементы" перечисления не являются объектами.
см. эту ссылку для получения дополнительной информации Apple 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]);
}
Хотя вопрос уже дан, вот мои два цента:
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);
Я думаю, это не так уж плохо и довольно близко к быстрому перечислению, которое вы хотите.
Элемент "Count" в перечислении хорош, но он заставит вас "не все случаи переключения обрабатываться" в инструкции switch
, если вы не обработаете этот элемент "count" в нем. Может быть, немного лучше использовать псевдонимы для первого и для последних элементов:
enum Colour {
firstColour = 0,
white = firstColour,
pink,
yellow,
blue,
lastColour = blue
} Colour;
for (int i = firstColour; i <= lastColour; ++i) {
}
Я пришел к этому сообщению, чтобы ответить на этот вопрос. Ответ Гобры велик. Но мое количество элементов может колебаться и коррелировать с сохраненным значением, поэтому, чтобы быть более безопасным, чтобы подсчет "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(), помещенной рядом с определением перечисления для удобства обслуживания.
В случаях, когда я не являюсь автором перечисления, я делаю это так. Я думаю, что это безопасно в будущем, поскольку он не заботится о том, как действительно реализуются типы перечислений.
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];
}