Porównanie ciągów w Objective-C


93

Obecnie mam skonfigurowany serwer sieciowy, który komunikuję się za pośrednictwem protokołu SOAP z moją aplikacją na iPhone'a. Zwracam ciąg zawierający identyfikator GUID i gdy próbuję porównać ten ciąg z innym ciągiem, otrzymuję dziwne wyniki.

Dlaczego to się nie pali? Z pewnością te dwie struny pasują do siebie?

NSString *myString = @"hello world";

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

1
To pytanie jest teraz w większości bezużyteczne, ponieważ zrzut ekranu zniknął. Dlatego kod należy skopiować i wkleić do pytań.
jscs

Myślę, że zrzut ekranu był błędem, ale odpowiedź została udzielona jak 2 lata temu!
ingh.am

1
Ale żaden przyszły czytelnik nie może zobaczyć błędu ani kodu, którego używałeś, aby wiedzieć, czy jest taki sam jak jego, co oznacza, że ​​to pytanie nie może pomóc nikomu innemu.
jscs

Poszukam obrazu. Rozumiem, że jest to baza odniesienia dla innych pytań, ale zamykanie go teraz jest trochę bezcelowe.
ingh.am

2
Dlaczego to pytanie jest zamknięte? To doskonale uzasadnione pytanie!
ibz

Odpowiedzi:


215

Użyj -isEqualToString:metody, aby porównać wartości dwóch ciągów. Użycie ==operatora C spowoduje po prostu porównanie adresów obiektów.

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

2
AH! Dziękuję bardzo. Poczuj się jak głupiec na tym!
ingh.am

3
Domyślam się, że w ObjectiveC ++ można utworzyć przeciążenie operatora, aby dać ci składniowo-cukrową możliwość użycia ==, ale żaden rozsądny programista C nie zrobiłby tego, ponieważ == jest używany tylko do sprawdzania tożsamości w obiektach C.
Warren P

48

W zależności od potrzeb możesz użyć porównania z rozróżnianiem wielkości liter lub bez uwzględniania wielkości liter. Rozróżnianie wielkości liter wygląda tak:

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

Niewrażliwość na wielkość liter wygląda tak:

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

1
Myślę, że powinno być: ([porównanie kategorii: @ opcje „Some String”: NSCaseInsensitiveSearch] == NSOrderedSame)
JaakL,

9
Uważaj na funkcję „porównaj”, ponieważ jeśli ciąg znaków (w tym przypadku „kategoria”) jest zerowy, porównanie zawsze zwróci NSOrderedSame.
nh32rg

To świetny punkt @ nh32rg !! +1 za to! Czy isEqualToString ma ten sam problem?
badweasel

4

Możesz porównać ciąg z poniższymi funkcjami.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.