2012-03-27 1 views
0

Можно создать дубликат:
Why is my comparing if statement not working?сравнение строк, если() следует неверной ветке

Я пытаю, чтобы проверить, если конкретный параметр был установлен в положении «On» или «Off ». Вот мой код:

BOOL switchOn; 
if ([self loadSettings:@"useLocation"] == @"On"){ 
    switchOn = YES; 
    NSLog(@"Use Location (Yes): %@",[self loadSettings:@"useLocation"]); 
}else{ 
    switchOn = NO; 
    NSLog(@"Use Location (No): %@",[self loadSettings:@"useLocation"]); 
} 
NSLog(@"Switch On: %@",switchOn ? @"YES":@"NO"); 

Отпечатано в сруба:

Использование Местонахождение (Нет): На

Включение: НЕТ

Вы можете видеть, что для «Использовать местоположение (нет)», чтобы вернуться, функция не должна возвращать «Вкл.». Но он вернул «Вкл». Разве я не правильно их сравниваю?

Вот мой код для загрузки по умолчанию:

- (NSString *)loadSettings: (NSString *)key{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults synchronize]; // this method is optional 

    // Get the results out 
    NSString *results = [defaults stringForKey:key]; 

    return results; 
} 

Я возвращающий NSString, так что я на самом деле не уверен, что проблема есть. Я не получаю никаких ошибок в среде сборки до или после компиляции.

+0

возможно дубликат: [Как сравнить строки в Objective C] (http://stackoverflow.com/q/1302985/1048330) – tenorsax

+0

Довольно много дубликат , но мой поиск не принес этого. – James

ответ

4

Вы должны использовать isEqualToString:

Ex:

if ([myString isEqualToString:@"YES"]) { 
    //do stuff 
} 

, как вы делаете это на самом деле сравнивающий указатели на самих объектов.

+0

Работал отлично. Так странно. Должен ли я сделать это для любой строки или только из строк, возвращаемых из функций? Я отмечу это как ответ, как только это позволит мне. – James

+0

Любая строка. Даже константы: '[@" TestString "isEqualToString: @" TestString "]' возвращает 'YES' – rosslebeau

+0

Хорошо, спасибо. Я буду помнить это. – James

3

Использование:

if([[self loadSettings:@"useLocation"] isEqualToString: @"On"] { 
    switchOn = YES; 
} 

As documented here

+0

Спасибо за ответ. Вы немного избили, но это ответ, так что все равно получите + голос. – James

5

== сравнивает указатели, так что даже если два NSStrings имеют одинаковое содержание, они не могут иметь один и тот же адрес в памяти, и в этом случае == будет ложным.

Используйте `isEqualToString» вместо:

if ([[self loadSettings:@"useLocation"] isEqualToString:@"On"]){ 
... 
+0

Спасибо за ответ. Вы немного избили, но это ответ, так что все равно получите + голос. – James

Смежные вопросы