Нечувствительность к регистру в NSArray содержит объект:
Я работаю над приложением, которое проверяет массив, чтобы увидеть, содержит ли он определенную строку. Однако, похоже, он работает неправильно, потому что я думаю, что он может смотреть на случай строки.
В этой строке кода, как бы я убедился, что containsObject: нечувствителен к регистру?
if ([myArray containsObject:term]) {...}
Пожалуйста, спросите, нужны ли вам разъяснения, и спасибо за вашу помощь.
(Кроме того, я нашел этот вопрос: Нечувствительное к регистру сравнение NSString. Я не знаю, нужно ли мне это, и если да, то как я бы использовал его)
Ответы
Ответ 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 ) {
//...
}
этот может быть вам полезен... Все Лучшие