2011-02-01 20 views
0

何らかの理由で、if条件で宣言された変数が未使用変数であり、後で使用される変数が未宣言変数を取得します。なぜこれが起こっているのか、それを修正する方法は何ですか?"if"条件が機能しない

NSString *name = [NSString stringWithFormat:@"Josh"]; 

if ([name isEqualToString:@"Josh"]) 
{ 
    NSString *greeting = [NSString stringWithFormat:@"Hello Josh"]; //Warning: Unused variable 'greeting' 
} 
else 
{ 
    NSString *greeting = [NSString stringWithFormat:@"Hello %@", name]; //Warning: Unused variable 'greeting' 
} 
NSLog (@"%@", greeting); //Error: 'greeting' undeclared 
+5

フォーマット引数を指定しないときに ' - [NSString stringWithFormat:]'を使わない理由は ' - [NSString stringWithString:]'です。また、 '@" Josh "'は完全に有効なNSStringインスタンスです。NSString * name = [NSString stringWithString:@ "Josh"]; '、NSString * name = @" Josh ";'と入力する必要はありません。この場合は同等です。 – justin

+0

@Justin、@theAmateurProgrammer: 'stringWithString:'を使う理由はあまりありません。通常は、文字列をそのまま使用してください。 –

+0

@Peter Hoseyコメントの2番目の文はこの点になります – justin

答えて

9

あなたは間違いなく約variables scopeを読んでください。

は、ここで適切なコードです:

NSString *name = [NSString stringWithFormat:@"Josh"]; 
NSString *greeting = nil; 

if ([name isEqualToString:@"Josh"]) 
{ 
    greeting = [NSString stringWithFormat:@"Hello Josh"]; 
} 
else 
{ 
    greeting = [NSString stringWithFormat:@"Hello %@", name]; 
} 

NSLog (@"%@", greeting); 
4

ifelseブロック内のものgreeting VARSを宣言することで、あなただけの、その範囲内でそれらを定義しています。一般的なルールとして

NSString *name = @"Josh"; 
NSString *greeting = nil; 

if ([name isEqualToString:@"Josh"]) 
{ 
    greeting = @"Hello Josh"; 
} 
else 
{ 
    greeting = [NSString stringWithFormat:@"Hello %@", name]; 
} 

NSLog (@"%@", greeting); 

:あなたはそうのようなif/elseブロック、前greetingを定義する必要がありますあなたが{ + }制御ブロック内で変数を宣言する場合、変数は外部に表示されなくなりますそのブロック。

関連する問題