如何在swift中使用谓词?

时间:2017-05-10 05:32:19

标签: swift nspredicate

任何人都可以解释我如何在 swift 中使用谓词,或者对于嵌套字典和字典数组有一些更好的方式来做同样的事情?

我的程序中有一系列嵌套字典,需要使用不同的键进行过滤,或者在相同情况下需要使用多个键进行过滤,所以请在swift中为我提供一个电池解决方案,我可以像NSPredicate那样过滤它。 ç

例如,我有以下json的一组员工 -

[{
    "name": "programmer",
    "email": "abc@gmail.com",
    "group": "A",
    "epmloyement": {
        "complany": "abc",
        "salary": 20000
    }
},
{
    "name": "designer",
    "email": "xyz@gmail.com",
    "group": "A",
    "epmloyement": {
        "complany": "zyz",
        "salary": 25000
    }
},
{
    "name": "tester",
    "email": "aaa@gmail.com",
    "group": "B",
    "epmloyement": {
        "complany": "xxx",
        "salary": 15000
    }
}]

我想要以下结果 - 如果我想要一系列字典,员工的工资大于2000 或者如果我想要一组字典,其中员工的组= A. 或者如果我想要一组字典,其中员工的团队= A和工资> 2000

2 个答案:

答案 0 :(得分:3)

您可以在swift中使用任何Objective C apis。

 var resultPredicate = NSPredicate(format: "name contains[c]%@",searchText)
 filteredArray = arrayToFIlter.filtered(using: resultPredicate)



1) NSPredicate(format: "name = %@", demoText)

//ARRAY
2) NSPredicate(format: "name = %@ AND nickName = %@", argumentArray: [name, nickname])


// IF CONTAINS
3)NSPredicate(format: "name contains[c] %@", demoText)

//ARRAY
4) NSPredicate(format: "name contains[c] %@ AND nickName contains[c] %@", argumentArray: [name, nickname])

尝试使用数组filter:方法

let digits = [1,4,10,15]
let even = digits.filter { $0 % 2 == 0 }
// [4, 10]

它非常直观,而且代码更少,更加快速。

  

你的查询:

//salary greater than 2000
a)let filteredArray =  arrayDemo.filter({(($0["epmloyement"] as! Dictionary<String,Any>)["salary"] as! Int) > 2000})

//group = A and salary > 2000
b)let fa = arrayDemo.filter({(($0["epmloyement"] as! Dictionary<String,Any>)["salary"] as! Int) > 2000 && ($0["group"] as! String) == "A"})

答案 1 :(得分:1)

使用以下

过滤数组
var filterArray = dicArray.filter { dic in
  guard let epmloyement = dic["epmloyement"] as? [String: Any] else {
    return false
  }
  guard let group = dic["group"] as? String else {
    return false
  }

  if let salary = epmloyement["salary"] as? Int {
    if (group == "A") && salary > 2000 {
      return true
    }
  }

  return false
}