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

Нечувствительность к регистру в NSArray содержит объект:

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

if ([myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
         return (BOOL)([obj caseInsensitiveCompare:term] == NSOrderedSame);
     }] != NSNotFound) {
    // there at least one object that matches term case-insensitively
}

Ответ 3

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

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

Swift 3 Option:

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

if things.contains(where: { $0.lowercased() == searchString.lowercased() }) {
    print("found searchString")
} else {
    print("searchString not found")
}

Ответ 4

- (BOOL)containsObject:(id)anObject 

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

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

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

Ответ 5

if ([@"Some String" caseInsensitiveCompare:@"some string"] == NSOrderedSame ) {
    //...
}

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