2015-03-14 2 views
1

Я пытаюсь отфильтровать массив массивов, который содержит основной объект данных типа Bird. Объекты были разделены на массивы массивов на основе UITableView с разделами и строками.NSPredicate на массиве массивов, где некоторая пустая

Для поиска я следующий метод, основанный на этот вопрос NSPredicate on array of arrays:

func filterContentForSearchText(searchText: String) { 
    let resultPredicate = NSPredicate(format: "SELF[0].common_name contains[cd] %@", searchText) 
    self.filteredBirds = self.birds.filteredArrayUsingPredicate(resultPredicate!) 
} 

Это, однако, приводит к ошибке

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array' 

, который, вероятно, имеет смысл, потому что массив имеет 27 (AZ, #) элементы, из которых некоторые не имеют объектов

Итак, как я могу настроить запрос NSPredicate, чтобы принять во внимание некоторые массивы, возможно, пустые?

+0

Почему у вас есть пустые массивы? Полезны ли они? Избавься от них. Другой ответ, на который вы ссылаетесь, - это другая проблема, вы не хотите индексировать в массив, вы хотите проверить содержимое полного массива ... – Wain

+0

Существуют пустые массивы, потому что UILocalizedIndexedCollation генерирует массив индексов (AZ, #) на основе локали пользователей – Dan

ответ

0

Если вы заинтересованы в более сильном типизированных операции фильтрации, и вы используете последнюю версию Xcode 6.3, вы можете использовать flatMap, который будет выполнять операцию отображения, которая возвращает массив на массиве массивов, и выравнивает результат. Затем вы можете использовать фильтр в подмассивах:

// assuming birds is an NSArray containing NSArrays of Bird 
if let arrayOfArrays = birds as? [[Bird]] { 
    let filteredBirds = arrayOfArrays.flatMap { birds in 
     birds.filter { bird in 
      bird.common_name.rangeOfString(searchText) != nil 
     } 
    } 
} 
1
let resultPredicate = NSPredicate(format: "[email protected] >0 AND SELF[0].common_name contains[cd] %@", searchText) 
+0

Просьба предоставить контекст вашему ответу. – Dan

+0

Спасибо за ответ. Добавление счетчика обошло проблему с пустым массивом, но ответ @AirspeedVelocity разрешил корень проблемы для фильтрации массива массивов. – Dan

Смежные вопросы