Ваше использование слова одновременный недостаточно ясно, чтобы описать, какого рода результаты поиска вы ожидаете.
Я полагаю,
если (и только если) name
соответствует searchText
или любому contentName
в contents
соответствует searchText
, экземпляр StructName
появляется в filteredArray
.
( соответствует определяется как ваш name
в вашем сообщении.)
Тогда вы можете написать что-то вроде этого:
var filteredArray = array.filter {
$0.name?.range(of: searchText, options: .caseInsensitive) != nil
|| $0.contents?.contains {content in content.contentName?.range(of: searchText, options: .caseInsensitive) != nil} == true
}
Если это не то, что вам нужно, вам может потребоваться более точно указать условие поиска.
(Кстати, name
или contents
должен быть опциональным?)
(для вашего обновленного примера)
Похоже, вы хотите, чтобы поиск по каждому персонажу был вызван.
Используя немного модифицированный пример:
var array = [StructName]()
let contentA = [Content(contentName: "Content_1"), Content(contentName: "Content_2")]
let contentB = [Content(contentName: "Content_3"), Content(contentName: "Content_4")]
array.append(StructName(name: "Name_1", contents: contentA))
array.append(StructName(name: "Name_2", contents: contentB))
с некоторой справкой по отладке:
extension StructName: CustomStringConvertible {
var description: String {
return "\(name ?? ""):\(contents?.map{$0.contentName ?? ""}.joined(separator: ";") ?? "")"
}
}
print(array) //->[Name_1:Content_1;Content_2, Name_2:Content_3;Content_4]
Вы можете написать что-то вроде этого:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText:String) {
let filteredArray = array.filter {element in
!searchText.lowercased().contains {searchChar in
!(element.name ?? "").lowercased().contains(searchChar)
&& !(element.contents ?? []).contains {content in (content.contentName ?? "").lowercased().contains(searchChar)}
}
}
print(filteredArray)
}
Пример вывода:
searchBar(UISearchBar(), textDidChange: "NC") //->[Name_1:Content_1;Content_2, Name_2:Content_3;Content_4]
searchBar(UISearchBar(), textDidChange: "1") //->[Name_1:Content_1;Content_2]
searchBar(UISearchBar(), textDidChange: "2") //->[Name_1:Content_1;Content_2, Name_2:Content_3;Content_4]
searchBar(UISearchBar(), textDidChange: "12") //->[Name_1:Content_1;Content_2]
Хотя я не уверен, ожидаете ли вы этого, поскольку ваше описание еще недостаточно ясно.