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)

希望对您有所帮助!