【问题标题】:Swift: How to filter UISearchBar for multiple strings?Swift:如何为多个字符串过滤 UISearchBar?
【发布时间】:2025-12-11 15:35:01
【问题描述】:

我想输入一个 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())
}

【问题讨论】:

    标签: swift filter filtering uisearchbar


    【解决方案1】:

    我确实找到了一个解决方案,确定它在性能的情况下不是最好的,但你可以从这里改进我​​的答案。

    我在Playground进行了测试,我确实留下了一些cmets,如果您需要更多信息,请告诉我,这是一个简单的代码:


    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 { $0.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: $0.title.lowercased(), subtitle: $0.subtitle.lowercased()) }
    
    /// First trying to find best result which is contains both `title` and `subtitle`
    var filteredArray = lowercasedItems
        .filter { searchedWords.contains($0.title) && searchedWords.contains($0.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($0.title) || searchedWords.contains($0.subtitle) }
    }
    
    print(searchedWords)
    print(filteredArray)
    

    希望对您有所帮助!

    【讨论】:

      最近更新 更多