【问题标题】:How to use predicate search with multiple keys in swift?如何在swift中使用多个键的谓词搜索?
【发布时间】:2021-02-18 11:15:15
【问题描述】:

我想使用名字和姓氏应用搜索过滤器,并且我已经完成了单字段搜索,但我想同时应用名字和姓氏的搜索。

var cityData = [[String: Any]]()


cityData.append(["id":1,"city":"Chicago","last_name":"Swire","first_name":"Sharlene"])
cityData.append(["id":1,"city":"Allahabad","last_name":"Singh","first_name":"Abhay"])
cityData.append(["id":1,"city":"Delhi","last_name":"Jaiswal","first_name":"Shikhar"])



let predicate = NSPredicate(format: "SELF contains[c] %@", searchTerm)
let searchData = cityData.filter { predicate.evaluate(with: $0["first_name"] as? String ?? "") }

但上面的代码只过滤名字,但我也需要过滤姓氏

【问题讨论】:

  • 对您收到的答案有任何反馈吗?

标签: ios swift predicate


【解决方案1】:

如果您想根据名字或姓氏查找城市,您可以像这样在过滤器操作中添加或条件 let searchData = cityData.filter { predicate.evaluate(with: $0["first_name"] as? String ?? "") || predicate.evaluate(with: $0["last_name"] as? String ?? "") }

请看下面的例子:

var cityData = [[String: Any]]()
    
    
    cityData.append(["id":1,"city":"Chicago","last_name":"Swire","first_name":"Sharlene"])
    cityData.append(["id":1,"city":"Allahabad","last_name":"Singh","first_name":"Abhay"])
    cityData.append(["id":1,"city":"Delhi","last_name":"Jaiswal","first_name":"Shikhar"])
    
    
    
    let predicate = NSPredicate(format: "SELF contains[c] %@", "l")
    let searchData = cityData.filter { predicate.evaluate(with: $0["first_name"] as? String ?? "") || predicate.evaluate(with: $0["last_name"] as? String ?? "") }
    print(searchData)

这将打印结果:

[["last_name": "Swire", "first_name": "Sharlene", "city": "Chicago", "id": 1], ["city": "Delhi", "last_name": "Jaiswal", "id": 1, "first_name": "Shikhar"]]

【讨论】:

    【解决方案2】:

    首先使用结构体而不是字典,这样可以避免所有丑陋的类型转换

    struct CityData {
        let id : Int
        let city, firstName, lastName : String
    }
    
    var cityData = [CityData]()
    
    cityData.append(CityData(id: 1, city: "Chicago", firstName: "Sharlene", lastName: "Swire"))
    cityData.append(CityData(id: 2, city: "Allahabad", firstName: "Abhay", lastName: "Singh"))
    cityData.append(CityData(id: 3, city: "Delhi", firstName: "Shikhar", lastName: "Jaiswal"))
    

    不需要使用NSPredicate,Swift 对filter 数组和range(of:options:) 有一个有效的本地方法,带有caseInsensitive 选项的作用与NSPredicate 中的[c] 属性相同

    let searchData = cityData.filter { $0.firstName.range(of: searchTerm, options: .caseInsensitive) != nil ||
                                       $0.lastName.range(of: searchTerm, options: .caseInsensitive) != nil
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多