【问题标题】:Swift - How to filter through multiple keywords using UISearchControllerSwift - 如何使用 UISearchController 过滤多个关键字
【发布时间】:2021-06-04 15:49:22
【问题描述】:

我有一个 UISearchController,当用户输入文本时,它会搜索对象。但是用户只能搜索一个关键字,我希望他们搜索多个关键字。

型号:

struct DiagnosisDetails: Codable {
    let diagnosisCodeId: Int
    let diagnosisMappingId: Int
    let diagnosisCode: String?
    let bodyRegion: String?
    let bodyPart: String?
    let bodySite: String?
}

搜索代码

 func filteredDiagnosis(for queryOrNil: String?) -> [DiagnosisDetails] {
        guard let diagnosis = self.diagnosis, let query = queryOrNil, !query.isEmpty else { return [] }
        
        let filteredDiagnosis: [DiagnosisDetails] = diagnosis.filter {
            if let bodyPart = $0.bodyPart,
               let bodySite = $0.bodySite,
               let bodyRegion = $0.bodyRegion,
               let diagnosisCode = $0.diagnosisCode {
                return (bodyPart.lowercased().contains(query.lowercased()) || bodySite.lowercased().contains(query.lowercased()) || bodyRegion.lowercased().contains(query.lowercased()) || diagnosisCode.lowercased().contains(query.lowercased()))
            } else {
                return false
            }
        }
        return filteredDiagnosis
    }

如何让用户搜索多个关键字?

【问题讨论】:

    标签: ios swift search uisearchcontroller


    【解决方案1】:

    您可以通过创建要查询的诊断字段的帮助字符串来简化搜索逻辑,然后找到与之匹配的任何子字符串。

    首先,创建从诊断返回“主搜索字符串”的函数:

    struct DiagnosisDetails: Codable, Hashable {
        let diagnosisCodeId: Int
        let diagnosisMappingId: Int
        let diagnosisCode: String?
        let bodyRegion: String?
        let bodyPart: String?
        let bodySite: String?
    
        func getSearchString() -> String {
            let bPart = bodyPart ?? ""
            let bSite = bodySite ?? ""
            let bRegion = bodyRegion ?? ""
            let dCode = diagnosisCode ?? ""
            return bPart + bSite + bRegion + dCode
        }
    }
    

    那么简单的搜索功能如下:

    func filteredDiagnosis(for queryOrNil: String?) -> [DiagnosisDetails] {
        guard let diagnosis = self.diagnosis, let query = queryOrNil, !query.isEmpty else { return [] }
    
        return diagnosis.filter({
            return $0.getSearchString().range(of: query, options: .caseInsensitive) != nil
        })
    } 
    

    UPD 多词搜索字符串的过滤功能:思路很简单——将搜索查询拆分为词,为每个匹配的词过滤诊断数组,并使用集合组合所有答案

    func filteredDiagnosis(for queryOrNil: String?) -> [DiagnosisDetails] {
        guard let diagnosis = self.diagnosis, let query = queryOrNil, !query.isEmpty else { return [] }
    
        let searchWords = query.components(separatedBy: " ").filter({$0 != ""})
        var filterResults = Set<DiagnosisDetails>()
    
        for word in searchWords {
            let wordResult = diagnosis.filter {$0.getSearchString().range(of: word, options: .caseInsensitive) != nil}
            for res in wordResult { filterResults.insert(res) }
        }
    
        return Array(filterResults)
    }
    

    【讨论】:

    • 感谢您的回复,但这仍然不能解决我遇到的问题。问题是用户输入空格键后,搜索栏不会查找空格后的文本。所以它只看第一个单词。
    • @isaacthedev 请检查更新的答案,通过这种功能,您将能够使用“code1 region2 site3”等搜索字符串
    猜你喜欢
    • 1970-01-01
    • 2021-05-18
    • 2013-04-11
    • 1970-01-01
    • 2015-09-25
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多