iPhone - Сравнение нулевого NSString с другим значимым NSString возвращает NSOrderedSame - PullRequest
6 голосов
/ 29 марта 2011

Я тестирую строку с другой, и я замечаю, что если первая строка равна nil, возвращаемое значение равно NSOrderedSame (значение 0).

if([oneString compare:otherString] == NSOrderedSame) возвращает YES, если oneString равно nil.

Итак, я должен проверить if(oneString != nil && [oneString compare:otherString] == NSOrderedSame)

Думаю, мне следует также проверить otherString в условии и создать специальный случай, если я хочу, чтобы [nil compare:nil] вернул NSOrderedSame.

Есть ли более удобный способ сравнения строк без необходимости выполнять такие тесты и действительно проверять, являются ли обе строки одинаковыми?

Ответы [ 4 ]

11 голосов
/ 29 марта 2011

Вы можете попробовать

[someString isEqualToString:@"someOtherString"];

Или для регистра без учета регистра:

[[someString lowerCaseString] isEqualToString:[otherString lowerCaseString]];
4 голосов
/ 29 марта 2011

Я бы использовал подход, предлагаемый @seretur, если вы не беспокоитесь о деле.В этом случае я бы использовал caseInsensitiveCompare:, который аналогичен методу compare:, который вы используете в настоящее время.

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

if (oneString && [oneString caseInsensitiveCompare:otherString] == NSOrderedSame) { ...
2 голосов
/ 29 марта 2011

Согласно документации строка не должна быть нулевой.Если это так, это может привести к странному поведению.

1 голос
/ 18 января 2013

Абсолютно законно отправлять что-либо в nitl. Но по определению он всегда вернет ноль. и ноль фактически равен 0 .

Если мы сейчас посмотрим на NSComparisonResult, NSOrderedSame тоже равно 0.

enum {
   NSOrderedAscending = -1,
   NSOrderedSame,
   NSOrderedDescending
};
typedef NSInteger NSComparisonResult;
...