Порівняння рядків у Objective-C


92

На даний момент у мене налаштовано веб-сервер, який я спілкуюся через SOAP зі своїм додатком для iPhone. Я повертаю рядок, що містить GUID, і коли я намагаюся порівняти це з іншим рядком, я отримую якісь дивні результати.

Чому б це не спрацювало? Напевно, ці дві струни збігаються?

NSString *myString = @"hello world";

if(myString == @"hello world")
    return;

1
Зараз це питання в основному марне, оскільки знімок екрана зник. Ось чому код слід вставляти у запитання.
jscs

Я думаю, що скріншот був помилкою, але відповідь була дана як 2 роки тому!
ingh.am

1
Але жоден майбутній читач не може побачити помилку або код, який ви використовували, щоб дізнатися, чи він такий самий, як їхній, а це означає, що це питання не може допомогти нікому іншому.
АТК

Буду шукати зображення. Я розумію, що це як довідкова база для інших питань, але закривати її зараз просто трохи безглуздо.
ingh.am

2
Чому це питання закрите? Це цілком слушне запитання!
ibz

Відповіді:


214

Використовуйте -isEqualToString:метод для порівняння значення двох рядків. Використання ==оператора С просто порівняє адреси об’єктів.

if ([category isEqualToString:@"Some String"])
{
    // Do stuff...
}

2
Ага! Щиро дякую вам. Відчуйте себе таким дурнем!
ingh.am

3
Я припускаю, що в ObjectiveC ++ ви можете створити перевантаження оператора, щоб надати вам синтаксично цукристу здатність використовувати ==, але жоден розумний програміст C цього не зробить, оскільки == використовується лише для перевірки ідентичності об'єктів C.
Warren P

48

Ви можете використовувати порівняння з урахуванням регістру або без урахування регістру, залежно від того, що вам потрібно. З урахуванням регістру виглядає так:

if ([category isEqualToString:@"Some String"])
{
   // Both strings are equal without respect to their case.
}

Не враховуючи регістр, це так:

if ([category compare:@"Some String" options:NSCaseInsensitiveSearch] == NSOrderedSame)
{
   // Both strings are equal with respect to their case.
}

1
Я думаю, це повинно бути: ([порівняння категорії: @ Параметри "Деякого рядка": NSCaseInsensitiveSearch] == NSOrderedSame)
JaakL,

9
Будьте обережні з функцією "порівняння", оскільки якщо рядок (у цьому випадку "категорія") дорівнює нулю, порівняння завжди повертає NSOrderedSame.
nh32rg

Це чудовий момент @ nh32rg !! +1 за це! Чи isEqualToString має таку ж проблему?
badweasel

5

Ви можете порівняти рядок із функціями нижче.

NSString *first = @"abc";
NSString *second = @"abc";
NSString *third = [[NSString alloc] initWithString:@"abc"];
NSLog(@"%d", (second == third))  
NSLog(@"%d", (first == second)); 
NSLog(@"%d", [first isEqualToString:second]); 
NSLog(@"%d", [first isEqualToString:third]); 

Output will be :-
    0
    1
    1
    1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.