Swift tableview中的快速全文搜索
我已签入StackOverflow,但未找到任何有效的查询解决方案Swift tableview中的快速全文搜索,swift,search,filter,tableview,swift5,Swift,Search,Filter,Tableview,Swift5,我已签入StackOverflow,但未找到任何有效的查询解决方案 struct MyModel{ let title: String let subTitle: String let image: UIImage } 现在我想搜索标题并将其输出,返回mymodel过滤器数组。 假设这是我的标题数组 [ "Swift CollectionView Xcode 11", "Swift UITableView Xcode 11", "Swift UICollectionView Xcode 11"
struct MyModel{
let title: String
let subTitle: String
let image: UIImage
}
现在我想搜索标题并将其输出,返回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代码11”、“Swift CollectionView代码11”-右侧
如果我搜索“collectionview Objective C”
,那么我需要这个搜索结果,它将为我提供带有过滤器的整个数组
“目标C集合视图代码11”,
“目标UIC集合视图代码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
}
还选中了“预测、排序和筛选”,但不适用于我
请帮帮我!谢谢。从我所看到的问题是,当您将字符串从空字符串“”中分离出来时,所发生的是关键字的形成
- 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: {$0}).sorted { $0.1.count > $1.1.count }
var resultArr2 : [String] = []
for (_, value) in dups {
resultArr2 = resultArr2 + self.serchedArray(arr: value, isInsideCheck: false)
}
let dups2 = Dictionary(grouping: resultArr2, by: {$0}).sorted { $0.1.count > $1.1.count }
//Remove duplicate values from dictionary and map to array
let finalArray = dups2.map { $0.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 $0.lowercased().components(separatedBy: " ").contains(str.lowercased()) {
return true
} else {
if isInsideCheck {
//Check any word is contained in array's element
let words = $0.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
}
它将返回Objective C CollectionView Xcode 11
作为finalArray中的第一个元素,因为它匹配所有三个词,即CollectionView
,Objective
,C
代码很长,因为我们正在检查数组的每个元素中searchString的每个单词,
我们先逐字核对,然后分类
希望这对你有帮助 你面临的主要问题是排序是否正确???是的排序,但我希望得到问题中提到的结果。现在检查答案是否已编辑…是的,请检查我在你的帖子上添加的评论。谢谢它有时会起作用如果我搜索多次,它也会显示以前的值。你能帮我查一下吗。感谢搜索表视图和第一个单元格,它向我显示collectionview记录?无论何时应用过滤器,首先我移除数组,然后应用代码。就是这样,它不是重复数据。现在它对我来说绝对有效。非常感谢。是的,但它必须给我一份关于收藏的记录,以及这方面的目标。