2011-08-06 11 views
18

W mojej aplikacji jest mechanizm, który wymaga, aby w pewnym momencie dwa były takie same, aby coś zrobić; z jakiegoś powodu, kiedy porównuję te dwa, nawet jeśli są one takie same, wciąż tego nie rozpoznają. Kod jest coś takiego:Porównaj dwa NSStrings

NSString * aString = [self someMethodThatGetsAString]; 

NSString * bString; 

BOOL areStringsTheSame = NO; 

while (areStringsTheSame != YES) { 

     bString = [self someMethodThatTakesNSStringsFromAnArrey]; 
     if (bString == aString) { 
      areStringsTheSame = YES; 
     { } 

nawet włożono NSLog() i upewnić się, że w pewnym momencie były takie same (io ile wiem, to co stoi na == ...), ale nadal nie dostał się do if, aby zmienić wartość BOOL.

Czy istnieje inny sposób na porównanie? Czy czegoś brakuje?

Odpowiedz

72

Można użyć metody isEqualToString::

if ([bString isEqualToString:aString]) 

== porównuje referencje (adresy) sznurki, a nie wartości ciągów.

+2

Prawdziwe. I zagłębić się w zasady OOP (dwa obiekty o tych samych właściwościach niekoniecznie są tymi samymi obiektami). W przeciwnym razie będziesz napotykał ten problem każdego dnia swojego życia programisty :-) – vstrien

+0

Najwyraźniej '==' działa tak samo, jak porównywanie ciągów znaków, ze względu na sposób, w jaki Objective-C używa zmiennych łańcuchowych. Na przykład, zadeklaruj ciąg A i ciąg B, i wykonaj '==', a przekonasz się, że oba są przechowywane w tym samym adresie. –

2

Ostatnio byłem zszokowany faktem, że dwa NSStrings, które przypominają się na NSLog mogą być inne. Dzieje się tak, ponieważ czasami NSString może zawierać znak o zerowej szerokości. Bądź świadomy, że i rozważyć:

#define ZERO_WIDTH_SPACE_STRING @"\u200B" 

Aby to zdobyć należy czyścić łańcuch od zera szerokości białych znaków przed porównaniem:

NSMutableString *eMailToAdd = [NSMutableString string]; 

NSMutableCharacterSet *charSet = [[NSCharacterSet whitespaceCharacterSet] mutableCopy]; 
    //[charSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; 

    NSString *rawStr = [[tokenField textField] text]; 
    for (int i = 0; i < [rawStr length]; i++) 
    { 
     if (![charSet characterIsMember:[rawStr characterAtIndex:i]]) 
     { 
      [eMailToAdd appendFormat:@"%@",[NSString stringWithFormat:@"%c", [rawStr characterAtIndex:i]]]; 
     } 
    } 
3

Takie podejście pracował dla mnie:

if ([firstString compare:secondString] == NSOrderedSame) { 
    //Do something when they are the same 
} else { 
    //Do something when they are different 
} 
Powiązane problemy