Przechodząc do sedna, odtworzyłem swój problem, ponieważ jest on dość oczywisty.
to jest zgodne bez błędu:
switch (n) {
case 1:
NSLog(@"");
NSString *aStr;
break;
default:
break;
}
to kompiluje się z błędem i brakuje tylko NSLog ():
switch (n) {
case 1:
NSString *aStr;
break;
default:
break;
}
zgłasza błąd podczas kompilacji " Oczekiwano wyrażenia przed 'NSString' "
Czy coś mi umyka?
Odpowiedzi:
W normalnym C musiałbyś ująć to w nawiasy w obu przypadkach. Podejrzewam, że to może rozwiązać twój problem:
case 1: { NSLog(@""); NSString *aStr; break; }
Zobacz to pytanie SO, aby uzyskać więcej informacji.
Innym sposobem obejścia tego problemu jest umieszczenie oświadczenia między etykietą przypadku a pierwszą deklaracją, tak jak w powyższym przykładzie roboczym. Zobacz komentarze i odpowiedź Quinna Taylora, aby uzyskać więcej informacji.
źródło
;
) pocase
etykiecie również działa. Przyczyną błędu i powodem, dla którego oba rozwiązania działają, jest to, że etykieta, w tymcase
etykieta, może tylko poprzedzać instrukcję. Deklaracje nie są instrukcjami w C (C99 §6.7, §6.8, §6.8.2) i Objective-C, więc nie możesz umieścić etykiety bezpośrednio przed deklaracją. Zatem rozwiązania: Albo umieść instrukcję (taką jak;
lubNSLog(@"");
) między etykietą a deklaracją lub zawiń deklarację wewnątrz instrukcji złożonej (nawiasy) po etykiecie.Nie możesz zadeklarować zmiennej jako pierwszej instrukcji w a
case
bez nawiasów, a także w wielu innych kontekstach w językach opartych na C. Aby uzyskać szczegółowe informacje, zobacz Deklarowanie zmiennych w instrukcji switch .źródło
case 0: { Loading my nib file; break; } case 1: { Loading another nib file; break; } Note that if you don't have an assignment (x = y) right after the case it won't be a problem. For example:
źródło