Swift 在表格视图中进行全文搜索

Swift Full text search in tableview

我在 Whosebug 中检查过 没有找到我的查询的任何有效解决方案。

struct MyModel{
let title: String
let subTitle: String
let image: UIImage
}

现在我想搜索 title 并输出它 return mymodel 过滤器数组。 假设这是我的标题数组。

[
"Swift CollectionView Xcode 11",
"Swift UITableView Xcode 11",
"Swift UICollectionView Xcode 11",
"Objective C UITableView Xcode 11",
"Objective C CollectionView Xcode 11",
"Objective C UICollectionView Xcode 11",
]

如果我搜索 "collectionView" 那么,

"Swift UICollectionView Xcode 11", "Swift CollectionView Xcode 11" - 右

如果我搜索 "collectionview Objective C" 那么,我想要这个搜索结果,它会给我整个数组和过滤器

"Objective C CollectionView Xcode 11", "Objective C UICollectionView Xcode 11", "Swift CollectionView Xcode 11", "Swift CollectionView Xcode 11",

因为在搜索中它也包含 collectionview 和 objective c。首先,如果它包含整个字符串,那么结果必须先显示给我,然后再显示其他。

我试过这种方法,但没用

let stringComponent = searchText.components(separatedBy: " ")
_ = searchText.components(separatedBy: " ").map{ (str) in
            arrTemp += arrVideo.filter { (data) -> Bool in
                if data.title.lowercased().contains(str.lowercased()) && !arrTemp.contains(data){
                    return true
                }
                return false
}

也检查了 NSPredicate, Sort and filter 但对我不起作用。

请帮帮我!谢谢。

据我所知,当您将字符串与空字符串 " " 分开时,问题就出现了,因此形成了关键字

- collectionview
- Objective
- C

并导致所有数据出现,因为 "C" 是一个单独的关键字。 难道我说所有数据都出现了?

检查下面的代码,它会根据最佳搜索结果对数组进行排序。

  let arr =  [
            "Swift CollectionView Xcode 11",
            "Swift UITableView Xcode 11",
            "Swift UICollectionView Xcode 11",
            "Objective C TableView Xcode 11",
            "Objective C CollectionView Xcode 11",
            "Objective C UICollectionView Xcode 11",
        ]

        //Sort the array and in dictioary according to search result
        let dups = Dictionary(grouping: self.serchedArray(arr: arr, isInsideCheck: true), by: {[=10=]}).sorted { [=10=].1.count > .1.count }

        var resultArr2 : [String] = []
        for (_, value) in dups {
            resultArr2 = resultArr2 + self.serchedArray(arr: value, isInsideCheck: false)
        }

        let dups2 = Dictionary(grouping: resultArr2, by: {[=10=]}).sorted { [=10=].1.count > .1.count }

        //Remove duplicate values from dictionary and map to array
        let finalArray = dups2.map { [=10=].value[0] }
        print(finalArray)

此函数是为搜索而创建的

   func serchedArray(arr : [String], isInsideCheck:Bool) -> [String] {
        var resultArr : [String] = []
        let searchText = "collectionview Objective C"
        let _ = searchText.components(separatedBy: " ").map { (str) in
            let searchedArr = arr.filter( {
                if [=11=].lowercased().components(separatedBy: " ").contains(str.lowercased()) {
                    return true
                } else {
                    if isInsideCheck {
                        //Check any word is contained in array's element
                        let words = [=11=].lowercased().components(separatedBy: " ")
                        for word in words {
                            if word.count > 1 {
                                if word.contains(str){
                                    return true
                                } else if str.contains(word) {
                                    return true
                                }
                            }
                        }
                     }
                    return false
                }
            })
            //Merge the array with previous result
            resultArr = resultArr + searchedArr
        }
        return resultArr
    }

它将 return Objective C CollectionView Xcode 11 作为 finalArray 中的第一个元素,因为它匹配所有三个单词,即 collectionviewObjectiveC.

代码很长,因为我们要在数组的每个元素中检查 searchString 的每个单词, 首先我们逐字检查然后排序。

希望这对您有所帮助..!!