2016-11-14 11 views
0
request(url!, method: .get, parameters: nil) 
     .responseJSON { response in 

      print(response.result) // result of response serialization 

      if let newJSON = response.result.value { 
       let json = JSON(newJSON) 
       for (key,subJson):(String, JSON) in json { 

        let age = subJson["age"] 
        let name = subJson["name"] 
        let status = subJson["status"] 

    //the code below looks kind of confusing if it gets longer 

        if age == "22"{ 
         if status == "highschool "{ 
          if name == "Leo"{ 
           //do something with the result 

JSONの結果がStringsと同じかどうかを確認する良い方法はありますか?正しいJSONの文字列との比較(SWIFT 3)

答えて

1

これは古典的なpyramid of doomです。それを取り除くにはいくつかの方法があり、あなたの状況に応じて適切なものを選ぶ必要があります。基本的には次の通りです。

  • 早期返品とguardステートメントを使用します。
  • 複数のif-letステートメントを1つにまとめる。
  • for-whereを使用してください。すべてのあなたの上に与えられた

はこのようなものにコードのあなたの部分を書き換えることができます:

request(url!, method: .get, parameters: nil) 
    .responseJSON { response in 
     print(response.result) // result of response serialization 

     guard let newJSON = response.result.value else { return } 

     let json = JSON(newJSON) 

     for (key,subJson):(String, JSON) in json { 
      let age = subJson["age"] 
      let name = subJson["name"] 
      let status = subJson["status"] 

      if age == "22" && status == "highschool" && name == "Leo" { 
       //do something with the result 
      } 
     } 
    } 
+0

をXcodeは '私にinserを尋ねます'名前年齢ステータス'の前に 'let'。私がそうするとき、それはその後、私にエラーを与える。 **条件バインディングの初期化子はオプションの型を持たなければなりません** – leo0019

+0

@ leo0019 'subJson [" age "]'はオプションではないようです。そして、この「ガード」ダンスをする必要はありません。通常の定数として宣言するだけです。答えを編集しました。 – kovpas

1

つの選択肢:

if age == "22" && status == "high school " && name == "Leo" { 

または

switch (age, status, name) { 
    case ("22", "high school ", "Leo"): ... 
    ... 
    default: ... 
}