Сравнение двух NSStrings

в моем приложении есть механизм, который требует, чтобы в определенный момент два NSStrings будет то же самое, чтобы что-то сделать; по какой-то причине, когда я сравниваю их, даже когда они одинаковы, он все еще не признает этого. Код примерно такой:

NSString * aString = [self someMethodThatGetsAString];

NSString * bString;

BOOL areStringsTheSame = NO;

while (areStringsTheSame != YES) {

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

Я даже вставил NSLog() и убедился, что в определенный момент они были одинаковыми (и, насколько я знаю, это то, что == стенды для...), но все же он не попал в if изменить BOOL значение.

есть ли другой способ сделать это сравнение? Я что-то упускаю?

3 ответов


вы можете использовать метод isEqualToString::

if ([bString isEqualToString:aString])

== сравнивает ссылки (адреса) строк, а не значение строк.


этот подход сработал для меня:

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

недавно я был потрясен тем фактом, что две NSStrings, которые похожи друг на друга в NSLog, могут быть разными. Это потому, что иногда NSString может содержать символ пробела нулевой ширины. Осознайте это и подумайте:

#define ZERO_WIDTH_SPACE_STRING @"\u200B"

чтобы победить это, вы должны очистить строку от символов пробела нулевой ширины перед сравнением:

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]]];
        }
    }