Подтвердить что ты не робот

Сравните два NSStrings

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

NSString * aString = [self someMethodThatGetsAString];

NSString * bString;

BOOL areStringsTheSame = NO;

while (areStringsTheSame != YES) {

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

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

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

4b9b3361

Ответ 1

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

if ([bString isEqualToString:aString])

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

Ответ 2

Этот подход работал у меня:

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

Ответ 3

Недавно я был потрясен тем, что два 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]]];
        }
    }