Сравнение без учета регистра со связкой строк - PullRequest
2 голосов
/ 11 июля 2010

Какой лучший способ сравнить NSString с кучей других строк без учета регистра?Если это одна из строк, метод должен вернуть YES, иначе NO.

Ответы [ 2 ]

10 голосов
/ 11 июля 2010

Вот небольшая вспомогательная функция:

BOOL isContainedIn(NSArray* bunchOfStrings, NSString* stringToCheck)
{
    for (NSString* string in bunchOfStrings) {
        if ([string caseInsensitiveCompare:stringToCheck] == NSOrderedSame)
            return YES;
    }
    return NO;
}

Конечно, это может быть значительно оптимизировано для разных случаев использования.

Если, например, вы выполняете много проверок постоянной константы bundOfStrings, вы можете использовать NSSet для хранения строчных версий строк и использовать containsObject::

BOOL isContainedIn(NSSet* bunchOfLowercaseStrings, NSString* stringToCheck)
{
    return [bunchOfLowercaseStrings containsObject:[stringToCheck lowercaseString]];
}
2 голосов
/ 28 октября 2014

Просто добавим несколько дополнений к ответу Николая:

NSOrderedSame определяется как 0

typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};

Так что если вы вызовете caseInsensitiveCompare: для объекта nil, выполучить nil.Затем вы сравниваете nil с NSOrderSame (что равно 0), вы получите совпадение, что, конечно, неправильно.

Также вам нужно проверить, должен ли параметр, переданный в caseInsensitiveCompare:, быть не нулевым.Из документации :

Это значение не должно быть равно нулю.Если это значение равно nil, поведение не определено и может измениться в будущих версиях OS X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...