iOS использует необъявленный идентификатор после оператора if-else - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть этот фрагмент кода, который воспроизводит мои mp3-файлы на моем iphone, и он работает:

if(i == 1) { 
  NSString *url = [[NSBundle mainBundle]pathForResource:@"fart" ofType:@"mp3"];
  player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:url] error:NULL];
  [player play];
} else if(i==2) {
  NSString *url = [[NSBundle mainBundle]pathForResource:@"fart6" ofType:@"mp3"];
  player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:url] error:NULL];
  [player play];  
} else {
  NSString *url = [[NSBundle mainBundle]pathForResource:@"fart7" ofType:@"mp3"];
  player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:url] error:NULL];
  [player play];
}

Единственные изменяющиеся строки - это NSString * url. Когда я пытаюсь выполнить приведенные ниже действия для очистки своего кода, я получаю сообщение об ошибке «использование необъявленного идентификатора« url »».

if(i == 1) { 
  NSString *url = [[NSBundle mainBundle]pathForResource:@"fart" ofType:@"mp3"];      
} else if(i==2) {
  NSString *url = [[NSBundle mainBundle]pathForResource:@"fart6" ofType:@"mp3"];        
} else {
  NSString *url = [[NSBundle mainBundle]pathForResource:@"fart7" ofType:@"mp3"];      
}

player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:url] error:NULL];
[player play];

Почему NSURL не понимает, что NSString * url устанавливается из приведенных выше операторов if-else?

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011

В Objective-C (и других языках C-base, которые я знаю) каждый блок имеет свою собственную область, поэтому, если вы объявите переменную в этой области, она не будет использоваться совместно с содержащим блоком, но переменные из содержащего блока могут бытьвидно из содержимого блока.

Немного смутное объяснение, но вот что вам нужно сделать:

NSString *url;
if(i == 1) { 
  url = [[NSBundle mainBundle]pathForResource:@"fart" ofType:@"mp3"];      
} else if(i==2) {
  url = [[NSBundle mainBundle]pathForResource:@"fart6" ofType:@"mp3"];        
} else {
  url = [[NSBundle mainBundle]pathForResource:@"fart7" ofType:@"mp3"];      
}

player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:url] error:NULL];
[player play];
2 голосов
/ 21 сентября 2011

"Область действия переменных ограничена блоком, в котором они объявлены".

Объявить url за пределами до блок if-else .Вы все еще можете оптимизировать свой код так, чтобы он был таким.

NSString *fileName = @"";
if (i == 1) fileName =  @"fart";
else if (i == 2) fileName =  @"fart6";
else fileName =  @"fart7"; 

NSString *path = [[NSBundle mainBundle]pathForResource:fileName ofType:@"mp3"];
NSURL *url = [NSURL fileURLWithPath:path];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
[player play];
2 голосов
/ 21 сентября 2011

Область объявления переменной url начинается в точке объявления (когда вы пишете NSURL *url) и заканчивается в конце окружающего блока (в }). Каждое из этих объявлений url находится в блоке (между { и }), но вы пытались использовать объявление вне любого из блоков, которые содержат объявление. Таким образом, к тому времени, когда вы попытаетесь его использовать, в области действия уже не будет объявлен идентификатор url.

Чтобы исправить это, переместите объявление из блоков, затем присвойте переменную из блоков:

NSString *url = nil;
if(i == 1) { 
  url = …;
} else if(i==2) {
  url = …;
} else {
  url = …;
}

player = [[AVAudioPlayer alloc]
    initWithContentsOfURL:[NSURL fileURLWithPath:url] error:NULL];
[player play];

В качестве альтернативы:

NSString *url = nil;
switch (i) {
case 1: url = …; break;
case 2: url = …; break;
default: url = …; break;
}

или даже:

NSString *url = (1 == i)? val1 : (2 == i)? val2 : valDefault;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...