2011-09-21 39 views
0

我有這樣的一段代碼起着在我的iPhone我的mp3文件,它的工作原理後:的iOS使用未申報indentifier的if-else語句

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不明白從上面的if-else語句中設置了NSString * url?

+0

鑑於資源包和類型相同,您的if/else塊可以設置文件名,從中可以生成URL,所以還有一種減少代碼重複的機會。 在這種情況下,我還建議你使用switch/case而不是一堆if/else語句。 – Baglan

+0

謝謝EmptyStack,Jeremy Sherman和Baglan!我希望我能給你所有的支票標記,以便你的解釋和解決方案! – user785179

回答

2

「範圍中的變量僅限於聲明它的塊」。

申報網址的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]; 
+0

嗨!感謝您的解決方案..你有什麼辦法找出玩家何時停止,釋放它?謝謝 – Frade

2

變量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; 
2

在Objective-C(以及我知道的其他C語言的語言)中,每個塊都有它自己的範圍,所以如果你聲明瞭一個在該範圍內變量,它不會與包含塊共享,但可以從包含的塊中看到來自包含塊的變量。

有點模糊的解釋,但在這裏就是你需要做什麼:

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];