нечувствительность к регистру в NSArray содержит объект: - PullRequest
17 голосов
/ 16 ноября 2011

Я работаю над приложением, которое проверяет массив, чтобы увидеть, содержит ли он определенную строку. Тем не менее, похоже, что это не работает правильно, потому что я думаю, что это может быть в случае с строкой. В этой строке кода, как я должен убедиться, что в файле selectedObject: регистр не учитывается?

if ([myArray containsObject:term]) {...}

Пожалуйста, спросите, нужны ли вам разъяснения, и спасибо за вашу помощь.

(Кроме того, я нашел этот вопрос: Сравнение без учета регистра NSString . Я не знаю, если это то, что мне нужно, и если это так, как бы я его использовал)

Ответы [ 5 ]

27 голосов
/ 16 ноября 2011
if ([myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
         return (BOOL)([obj caseInsensitiveCompare:term] == NSOrderedSame);
     }] != NSNotFound) {
    // there's at least one object that matches term case-insensitively
}
17 голосов
/ 24 октября 2013

Вот эффективный подход с использованием кодирования значения ключа.

NSArray *strings; // array of strings
if ([[strings valueForKey:@"lowercaseString"] containsObject:[searchString lowercaseString]]) {
   NSLog(@"searchString found");
} else {
   NSLog(@"searchString NOT found");
}

Swift 3 Опция:

let things = ["foo", "Bar"]
let searchString = "FOO"

if things.contains(where: { $0.lowercased() == searchString.lowercased() }) {
    print("found searchString")
} else {
    print("searchString not found")
}
7 голосов
/ 16 ноября 2011

NSArray (целенаправленно) не знает, что он держит. Таким образом, он не знает о NSString, а тем более о чувствительности к регистру. Вам придется пройтись по элементам массива и сравнить их. Вы можете использовать один из множества способов циклического перемещения по массиву:

  • objectEnumerator
  • indexOfObjectPassingTest:, который использует блоки для выполнения вашей операции.
  • звоните objectAtIndex: за каждый предмет.

Я бы предложил один из первых 2 вариантов.

0 голосов
/ 16 ноября 2011
if ([@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
    //...
}

это может быть полезно для вас ... Все лучшее

0 голосов
/ 16 ноября 2011
- (BOOL)containsObject:(id)anObject 

- это удобный метод, который вы не можете применять для своих целей. Вот обсуждение документации:

Этот метод определяет, присутствует ли anObject в массиве отправка isEqual: сообщение каждому из объектов массива (и передача anObject в качестве параметра каждому сообщению isEqual:).

Общий метод NSObject isEqual: Метод не может быть сделан, чтобы учесть случай строковых символов. Лучшее решение, если вы можете использовать блоки (iOS 4), вероятно, что-то вроде предложения Кевина Балларда. Если нет, то вам, возможно, придется перебирать строки.

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