Ошибка «Оператор требует выражения целочисленного типа» с оператором switch и массивом строк - PullRequest
4 голосов
/ 06 марта 2012

Попытка работать с массивом, но это дает мне "Оператор требует выражения целочисленного типа (недопустимый идентификатор ')" прямо в операторе switch. Что не так?

NSArray count = [NSArray arrayWithObjects: @"1", @"2", @"3", @"4", @"5", @"6", @"7", nil];    

switch ([count objectAtIndex: myIndex]) {
    case 1:
        NSLog(@"One");
        break;
    case 2:
        NSLog(@"Two");
        break;
    case 3:
        NSLog(@"Three");
        break;
    default:
        break;
}

Ответы [ 4 ]

12 голосов
/ 06 марта 2012

Оператор switch работает только для целочисленных типов. Ваш массив содержит NSString объектов. Преобразуйте NSString, полученное из массива, в целое число, например:

NSArray count = [NSArray arrayWithObjects: @"1", @"2", @"3", @"4", @"5", @"6", @"7", nil];

NSString *obj = [count objectAtIndex: myIndex];
switch ([obj intValue]) {
    case 1:
        NSLog(@"One");
        break;
    case 2:
        NSLog(@"Two");
        break;
    case 3:
        NSLog(@"Three");
        break;
    default:
        break;
}
2 голосов
/ 06 марта 2012

Вы создаете массив литералов NSStrings и делаете операторы case для целых чисел.Вы можете включить только целочисленные типы.

Проблема в том, что arrayWithObjects создает массив объектов, производных от NSObject, которые нельзя включить в объект (id).

Если вы хотите сохранитьмассив чисел, тогда один вариант - хранить объекты NSNumber, а не полагаться на хрупкость хранения строк, которые, как вы надеетесь, являются числами.Это работает:

NSArray *arr = [NSArray arrayWithObjects: [NSNumber numberWithInt:1], [NSNumber numberWithInt:2], nil];

switch ([[arr objectAtIndex:1] intValue]) {
    case 1:
        NSLog(@"1");
        break;

    case 2:
        NSLog(@"2");
        break;

    default:
        break;
}

Это выводит:

2012-03-05 23:23:46.798 Craplet[82357:707] 2
1 голос
/ 06 марта 2012

Ваши объекты массива - NSStrings, а не int.Какую общую картину вы пытаетесь достичь?

Вы можете:

NSString *str = [count objectAtIndex:myIndex];
if ([str isEqualToString:@"1"]) NSLog(@"One");
else if ... // etc

Еще лучше:

static NSString *one = @"1";
static NSString *two = @"2";
// etc

NSArray *count = [NSArray arrayWithObjects:one, two, ... nil];

NSString *str = [count objectAtIndex:myIndex];

if (str == one) NSLog(@"One"); // this works because now 'str' and 'one' are the same object
else if ... // etc
1 голос
/ 06 марта 2012

[count objectAtIndex:] возвращает Id (он же объект), который в вашем конкретном случае был бы строкой NSString, в любом случае это не int, которого ожидает ваше выражение case. Вам нужно, чтобы [[count objectAtIndex:myIndex] intValue] преобразовал NSString в целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...