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 中的第一个元素,因为它匹配所有三个单词,即 collectionview
、Objective
、C
.
代码很长,因为我们要在数组的每个元素中检查 searchString 的每个单词,
首先我们逐字检查然后排序。
希望这对您有所帮助..!!
我在 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 中的第一个元素,因为它匹配所有三个单词,即 collectionview
、Objective
、C
.
代码很长,因为我们要在数组的每个元素中检查 searchString 的每个单词, 首先我们逐字检查然后排序。
希望这对您有所帮助..!!