2017-07-03 12 views
0

私が持っている文字列の配列let filterClassName = ["A","B"]スウィフトに辞書で文字列配列を比較3

今私が持っているように見える辞書:responseArrayから今

var responseArray: [[String: Any]] = [] 

responseArray.append(["id": 1,"name": "Prateek", "className": "A"]) 
responseArray.append(["id": 1,"name": "rateek", "className": "B"]) 
responseArray.append(["id": 3,"name": "ateek", "className": "C"]) 
responseArray.append(["id": 4,"name": "teek", "className": "D"]) 
responseArray.append(["id": 5,"name": "eek", "className": "A"]) 
responseArray.append(["id": 6,"name": "ek", "className": "E"]) 

は私の辞書である私たい私のクラス名と一致するすべての値

:だから filterClassName

に述べたように、私はの配列として出力を取得する必要があります["id":1、 "name": "Prateek"、 "className": "A"]、["id":1、 "name": "rateek"、 "className": "B"]

、["id":5、 "name": "eek"、 "className": "A"]

ありがとうございます!

これは私がしようとしたものです:

for value in filterClassName { 
    let cal = responseArray.filter { (($0["className"] as! String).contains(value)) } 
    for value in cal { 
     let valuesss = value 
     print ("valuesss" + String(describing: valuesss)) 
    } 
} 

を私の上記の答えは非常に基本的なものですが、私は仕事にこのような何かしたい:フィルタリングのために短い、一行で

let cal = responseArray.filter { (($0["className"] as! String).contains(filterClassName)) } 

をしていません私はそれらを憎むようにループのために!

+0

何を試しましたか?私たちは、事前の努力がない質問に答えるのは好きではありません。 – Alexander

+0

@アレクサンダー:編集中! –

+0

これは辞書の不適切な使い方です。代わりにレスポンスを表すために構造体を作成する必要があります。フィルタリングが簡単になります。 – Hamish

答えて

2

は、あなたは非常に接近しているが、それは他の方法でラウンドです:

let filteredItems = responseArray.filter{ filterClassName.contains($0["className"] as! String) } 

しかし - ハミッシュはコメントで述べたように - それは、カスタム構造体を使用する方が効率的です。

あなたのコード:追加する

let filterClassName = ["A","B"] 

var responseArray: [[String: Any]] = [] 

responseArray.append(["id": 1,"name": "Prateek", "className": "A"]) 
responseArray.append(["id": 1,"name": "rateek", "className": "B"]) 
responseArray.append(["id": 3,"name": "ateek", "className": "C"]) 
responseArray.append(["id": 4,"name": "teek", "className": "D"]) 
responseArray.append(["id": 5,"name": "eek", "className": "A"]) 
responseArray.append(["id": 6,"name": "ek", "className": "E"]) 

コード:

struct Student { 
    let name, className : String 
    let id : Int 

    init?(dictionary: [String:Any]) { 
     guard let id = dictionary["id"] as? Int, 
      let name = dictionary["name"] as? String, 
      let className = dictionary["className"] as? String else { return nil } 
     self.id = id 
     self.name = name 
     self.className = className 
    } 
} 

let students = responseArray.flatMap { Student(dictionary:$0) } 
let filteredItems = students.filter{ filterClassName.contains($0.className) } 
print(filteredItems) 
+0

ありがとうございます私が期待していたものです! –

2

あなたはfilterClassNameアレイは、クラス名が含まれて確認する必要があります。

let filteredResponse = responseArray.filter { filterClassName.contains($0["className"] as! String) } 
関連する問題