2017-05-10 8 views
0

私はどのように私が使用することができるか説明することができます述語swiftまたはネストされた辞書と辞書の配列のために同じを行うためにいくつかのバッター方法がありますか?迅速に述語を使用するには?

私のプログラムにネストされた辞書の配列があり、別のキーでフィルタリングする必要があります。同じケースでは複数のキーでフィルタリングする必要がありますので、NSPredicateのようにフィルターをかけることができます

-c例えば、私は次のjson-

[{ 
    "name": "programmer", 
    "email": "[email protected]", 
    "group": "A", 
    "epmloyement": { 
     "complany": "abc", 
     "salary": 20000 
    } 
}, 
{ 
    "name": "designer", 
    "email": "[email protected]", 
    "group": "A", 
    "epmloyement": { 
     "complany": "zyz", 
     "salary": 25000 
    } 
}, 
{ 
    "name": "tester", 
    "email": "[email protected]", 
    "group": "B", 
    "epmloyement": { 
     "complany": "xxx", 
     "salary": 15000 
    } 
}] 

から従業員の配列を持っていると私はどこの従業員2000 場合、またはより大きい給料を得る辞書の配列をしたい場合、私は結果 - 次たい私は従業員whosの辞書の配列が欲しいeグループ= A またはグループのAと給与> 2000の従業員が辞書の配列を必要とする場合

+1

次を使用して、あなたの配列をフィルタリングまあ、何もこれだけ 'NSPredicate'を使用し、迅速でObjective CのAPIを使用してからあなたを停止しません! – Sweeper

+0

しかし、迅速に利用可能ないくつかの他のバッターの方法なら、私は同じのための迅速なAPIを選択します。 –

+0

@DineshKumarVyas試したことのある例と期待される結果は何かを示す必要があります –

答えて

2

どのObjective C APIも迅速に使用できます。

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] 

その非常に直感的でより少ないコード、より多くのswiftyタイプを試してみてください。

YOUR QUERY:

//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"}) 
+0

私は自分の質問を更新しましたが、私は期待している結果を私に与えることができるフィルタ構文はありますか? –

+1

'filter'も使うことをお勧めします。オブジェクトを受け取り、 'Bool'を返す関数を適用すると考えてみましょう: のemployees.filter {employee - > Bool return employee.group ==" A " && employment.salary> = 2000 } – XML

+0

私は答えを更新しました。それを確認してください。 – ankit

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 
}