Что мы обычно делаем в этом случае, так это всегда оставляем последний элемент в enum как «count» или «last». В вашем случае, например:
typedef NS_ENUM(NSInteger, TABLE_SECTION_ITEMS)
{
TABLE_SECTION_Images,
TABLE_SECTION_Videos,
TABLE_SECTION_Documents,
TABLE_SECTION_Audios,
TABLE_SECTION_Count
};
Мы не указываем значения, поскольку это может нарушить логику. Но вы можете изменить порядок элементов и отказаться от них, поставив элементы после «count».
Тогда его использование выглядит примерно так:
@interface ViewController()<UITableViewDelegate, UITableViewDataSource>
@end
@implementation ViewController
- (NSString *)tableSectionName:(TABLE_SECTION_ITEMS)item {
switch (item) {
case TABLE_SECTION_Images: return @"Images";
case TABLE_SECTION_Videos: return @"Videos";
case TABLE_SECTION_Documents: return @"Documents";
case TABLE_SECTION_Audios: return @"Audios";
case TABLE_SECTION_Count: return nil;
}
}
- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return TABLE_SECTION_Count;
}
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
cell.textLabel.text = [self tableSectionName:indexPath.row];
return cell;
}
@end
Таким образом, число строк просто TABLE_SECTION_Count
, и вы можете естественно конвертировать между NSInteger
и вашим перечислением, как видно из [self tableSectionName:indexPath.row]
.
Естественно, сопоставление для строк по-прежнему необходимо выполнить, как в tableSectionName
. Он не простаивает, но теперь более чем управляем;
Когда вы добавляете новое значение перечисления (скажем, TABLE_SECTION_Documents2
), вы получите n ошибку в tableSectionName
, что вам нужно добавить новый случай (или, скорее, ошибку, связанную с ним, которая говорит, что Control может достичь конца пустая функция). Поэтому, как разработчик, вы должны заполнить его так:
- (NSString *)tableSectionName:(TABLE_SECTION_ITEMS)item {
switch (item) {
case TABLE_SECTION_Images: return @"Images";
case TABLE_SECTION_Videos: return @"Videos";
case TABLE_SECTION_Documents: return @"Documents";
case TABLE_SECTION_Documents2: return @"Documents";
case TABLE_SECTION_Audios: return @"Audios";
case TABLE_SECTION_Count: return nil;
}
}
Еще один бонус в том, что мы можем иметь «Документы» дважды.
И чтобы исключить элемент, все, что нам нужно сделать, это переместить перечисление после подсчета:
typedef NS_ENUM(NSInteger, TABLE_SECTION_ITEMS)
{
TABLE_SECTION_Images,
TABLE_SECTION_Videos,
TABLE_SECTION_Documents2,
TABLE_SECTION_Audios,
TABLE_SECTION_Count, // Always keep last
// Deprecated items
TABLE_SECTION_Documents
};
Теперь старые «Документы» не будут перечислены в вашем табличном представлении без необходимости изменения какого-либо кода. Не идеально, но все же довольно аккуратно.