如何按搜索词过滤短语数组

时间:2019-09-04 07:18:43

标签: swift search uicollectionview uisearchbar

我有一个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”之类的几个词组成。现在,如果我从以下位置搜索任何内容,该函数将返回此配方:

  • 红色
  • r
  • lvet
  • 天鹅绒

我如何做到这一点,以便它根据name中每个单词的开始来过滤配方。因此,只有在我搜索时,它才会返回配方:

  • 红色
  • 天鹅绒
  • 蛋糕
  • 天鹅绒蛋糕

还可以在搜索条件为空或仅空格时返回所有配方吗?

我在这里寻找答案,但只能找到与现有解决方案相似的解决方案。谢谢!

2 个答案:

答案 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
    })
}