Swift: 如何为多个字符串过滤 UISearchBar?
Swift: How to filter UISearchBar for multiple strings?
我想输入一个 UISearchBar 2 个字符串。
例如。 bob man
.
let itemArray: [searchItem] = [
searchItem(title: "Bob", subtitle: "Man"),
searchItem(title: "Bob", subtitle: "Woman"),
searchItem(title: "Joe", subtitle: "Man")
]
var filteredArray = [searchItem]()
我怎样才能确保得到关注searchItem
:
只有 searchItem(title: "Bob", subtitle: "Man")
因为只有匹配 bob
AND man
.
当您只搜索 bob
时,您会返回 2 个项目:
searchItem(title: "Bob", subtitle: "Man"),
searchItem(title: "Bob", subtitle: "Woman")
我已有的代码:
filteredArray = itemArray.filter { obj in
obj.title.lowercased().contains(searchBarText.lowercased()) ||
obj.subtitle.lowercased().contains(searchBarText.lowercased())
}
我确实找到了解决方案,当然它在 性能 的情况下不是最好的,但你可以从这里改进我的答案。
我在 Playground
中对其进行了测试,我确实留下了一些评论,如果您需要更多信息,请告诉我,这是一个简单的代码:
import Foundation
struct SearchItem {
let title: String
let subtitle: String
}
/// Trim white spaces from start and end, and map all words to lowercase
let searchedWords = "Bob man woman"
.trimmingCharacters(in: .whitespacesAndNewlines)
.components(separatedBy: " ")
.map { [=10=].lowercased() }
let itemArray: [SearchItem] = [
SearchItem(title: "Bob", subtitle: "Woman"),
SearchItem(title: "Joe", subtitle: "Man"),
SearchItem(title: "Bob", subtitle: "Man")
]
/// Lowercase all itemArray
let lowercasedItems = itemArray
.map { SearchItem(title: [=10=].title.lowercased(), subtitle: [=10=].subtitle.lowercased()) }
/// First trying to find best result which is contains both `title` and `subtitle`
var filteredArray = lowercasedItems
.filter { searchedWords.contains([=10=].title) && searchedWords.contains([=10=].subtitle) }
/// `filteredArray.isEmpty == false`, then we didn't find best result which contains both `title` and `subtitle`
/// `filteredArray.isEmpty == true` then we'll try to find at least one match
if filteredArray.isEmpty {
filteredArray = lowercasedItems
.filter { searchedWords.contains([=10=].title) || searchedWords.contains([=10=].subtitle) }
}
print(searchedWords)
print(filteredArray)
希望对您有所帮助!
我想输入一个 UISearchBar 2 个字符串。
例如。 bob man
.
let itemArray: [searchItem] = [
searchItem(title: "Bob", subtitle: "Man"),
searchItem(title: "Bob", subtitle: "Woman"),
searchItem(title: "Joe", subtitle: "Man")
]
var filteredArray = [searchItem]()
我怎样才能确保得到关注searchItem
:
只有 searchItem(title: "Bob", subtitle: "Man")
因为只有匹配 bob
AND man
.
当您只搜索 bob
时,您会返回 2 个项目:
searchItem(title: "Bob", subtitle: "Man"),
searchItem(title: "Bob", subtitle: "Woman")
我已有的代码:
filteredArray = itemArray.filter { obj in
obj.title.lowercased().contains(searchBarText.lowercased()) ||
obj.subtitle.lowercased().contains(searchBarText.lowercased())
}
我确实找到了解决方案,当然它在 性能 的情况下不是最好的,但你可以从这里改进我的答案。
我在 Playground
中对其进行了测试,我确实留下了一些评论,如果您需要更多信息,请告诉我,这是一个简单的代码:
import Foundation
struct SearchItem {
let title: String
let subtitle: String
}
/// Trim white spaces from start and end, and map all words to lowercase
let searchedWords = "Bob man woman"
.trimmingCharacters(in: .whitespacesAndNewlines)
.components(separatedBy: " ")
.map { [=10=].lowercased() }
let itemArray: [SearchItem] = [
SearchItem(title: "Bob", subtitle: "Woman"),
SearchItem(title: "Joe", subtitle: "Man"),
SearchItem(title: "Bob", subtitle: "Man")
]
/// Lowercase all itemArray
let lowercasedItems = itemArray
.map { SearchItem(title: [=10=].title.lowercased(), subtitle: [=10=].subtitle.lowercased()) }
/// First trying to find best result which is contains both `title` and `subtitle`
var filteredArray = lowercasedItems
.filter { searchedWords.contains([=10=].title) && searchedWords.contains([=10=].subtitle) }
/// `filteredArray.isEmpty == false`, then we didn't find best result which contains both `title` and `subtitle`
/// `filteredArray.isEmpty == true` then we'll try to find at least one match
if filteredArray.isEmpty {
filteredArray = lowercasedItems
.filter { searchedWords.contains([=10=].title) || searchedWords.contains([=10=].subtitle) }
}
print(searchedWords)
print(filteredArray)
希望对您有所帮助!