我有一个UISearchBar
,并且正在按如下搜索字词过滤UICollectionView
:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredRecipes = getRecipes().filter({( recipe : Recipe ) -> Bool in
return recipe.name.lowercased().contains(searchText.lowercased())
})
if searchText == "" || searchText == " " {
filteredRecipes = getRecipes()
}
}
每个Recipe
都有一些属性,我要过滤的属性之一是name
,它由诸如“ Red Velvet Cake”之类的几个词组成。现在,如果我从以下位置搜索任何内容,该函数将返回此配方:
我如何做到这一点,以便它根据name
中每个单词的开始来过滤配方。因此,只有在我搜索时,它才会返回配方:
还可以在搜索条件为空或仅空格时返回所有配方吗?
我在这里寻找答案,但只能找到与现有解决方案相似的解决方案。谢谢!
答案 0 :(得分:1)
像这样使用 filter(_:)
, contains(where:)
和 hasPrefix(_:)
的组合,
filteredRecipes = getRecipes().filter({
let components = $0.name.components(separatedBy: " ")
return components.contains(where: {
$0.lowercased().hasPrefix(searchText.lowercased())
})
})
答案 1 :(得分:1)
您可以使用enumerateSubstrings方法并将recipe.name
的每个单词与searchText
进行比较
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
guard !searchText.trimmingCharacters(in: .whitespaces).isEmpty else {
filteredRecipes = getRecipes()
return
}
filteredRecipes = getRecipes().filter({
var result = false
$0.name.enumerateSubstrings(in: $0.name.startIndex..<$0.name.endIndex, options: [.byWords], { (word, _, _, _) in
if let word = word, word.caseInsensitiveCompare(searchText) == .orderedSame {
result = true
}
})
return result
})
}