【问题标题】:How do I filter data to startswith instead of contains如何过滤数据以开始而不是包含
【发布时间】:2021-07-22 00:06:56
【问题描述】:

我有一个 UITableView,它有一个搜索控制器,用于使用下面的代码过滤数据

func updateSearchResults(for searchController: UISearchController) {
     let searchString = searchController.searchBar.text
     filteredArray = data.filter({ (country) -> Bool in let countryText: NSString = country as NSString         
     return (countryText.range(of: searchString!, options: NSString.CompareOptions.caseInsensitive).location) != NSNotFound })
     suggestionview.reloadData()
}

如何使搜索通过查看字符串的开头而不是匹配任何位置来过滤表。

例如,目前如果我在搜索输入中输入 Lon,我会得到一个包含 Lon 的列表(在到达伦敦之前仍然是一个巨大的列表)。

【问题讨论】:

    标签: ios swift uisearchcontroller


    【解决方案1】:

    你应该看看hasPrefix(_:)

    返回一个布尔值,指示字符串是否以指定前缀开头。

    例如:

    let items = [
        "London",
        "Londis",
        "Somelond",
        "Freelond"
    ]
    
    let searchTerm = "Lon"
    
    for item in items.filter({ itm -> Bool in
        itm.lowercased().hasPrefix(
            searchTerm.lowercased()
        )
    }) {
        print(item)
    }
    
    // Output
    London
    Londis
    
    

    或者针对您的具体情况:

    filteredArray = data.filter({ country -> Bool in        
        country.lowercased().hasPrefix(
            searchString!.lowercased()
        )
    )
    

    【讨论】:

    • “例如,目前如果我在搜索输入中输入 Lon,我会得到一个包含 Lon 的列表(在到达伦敦之前仍然是一个巨大的列表)。”
    • @ElTomato 没错,hasPrefixcontains 不同
    • 这不是他或她想要的。根据引用的评论,他或她想要返回一个或多个完全匹配。
    • 天哪!谢谢你。我在很短的时间内尝试使用 hasPrefix,但没有运气,但结果证明我在错误的变量上做。
    • 示例说明和仅供参考(以防有一天您遇到该问题):let strings2 = ["SS", "ß", "ss"]; strings2.forEach { print("Testing: \($0)"); print("Prefix Lowercase: \($0.lowercased().hasPrefix("ß".lowercased()))"); print("Prefix Uppercase: \($0.lowercased().hasPrefix("ß".lowercased()))"); print("CaseInsensitive: \($0.range(of: "ß", options: [.caseInsensitive, .anchored]) != nil)") }
    【解决方案2】:

    你为什么使用NSString?在 Swift 3+ 中更喜欢 String

    filteredArray = data.filter({ (country) -> Bool in 
        let countryText: NSString = country as NSString         
        return (countryText.range(of: searchString!, options: NSString.CompareOptions.caseInsensitive).location) != NSNotFound })
        
    

    =>

    filteredArray = data.filter({ country -> Bool in 
        return country.range(of: searchString!, options: .caseInsensitive) != nil })
    

    您使用了.caseInsenstive 选项,但也有一个您可能感兴趣的.anchored

    搜索仅限于源字符串的开始(或结束,如果NSBackwardsSearch)。

    filteredArray = data.filter({ country -> Bool in 
        return country.range(of: searchString!, options: [.caseInsensitive, .anchored]) != nil })
    

    【讨论】:

    • 这更容易,我喜欢这两个答案,但这个似乎更简单。但是 .anchored 选项是什么,它似乎无效
    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 2020-05-25
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多