2016-12-15 9 views
1

Swiftでnull値を持つJSON戻り値を処理する方法を尋ねたいだけです。 値をアンラッピングするためにガードを使用しましたが、下の例のようにJSONにnull値がある場合、ガードは実行されません。Swiftでguardを使用してnilでJSON応答を処理する方法

ガードを使用する適切な方法についても知りたいと思います。 1つのガードで複数の条件を使用するのは大丈夫ですか?下のサンプルコードのように?

{ 
    "error_code": "0", 
    "error_description": [], 
    "status": true, 
    "results": { 
    "id": 25, 
    "email": "[email protected]", 
    "created_at": "2016-12-10T15:54:03.779Z", 
    "updated_at": "2016-12-15T06:41:49.432Z", 
    "first_name": "Juan", 
    "last_name": "Cruz", 
    "middle_name": "Dela", 
    "nickname": "joe", 
    "option_nickname": null, 
    "age": 24, 
    "gender": "Male", 
    "mobile_number": "639959283721", 
    "photo_url": { 
    "url": null 
    }, 
    "school": "University of the Philippines", 
    "user_address": null, 
    "city": "Quezon City", 
    "country": null, 
    "longtitude": 121.0621301, 
    "latitude": 14.5832954, 
    "facebook_user_id": null, 
    "device_token": null, 
    "token": "YrxVEWUMYxieFy7PEsAn", 
    "is_sent": false, 
    "show_nickname": false 
}, 
"error": [] 

}

ここに私のコードです:

func UserLogin(facebookID: String) -> Void { 
    UIApplication.shared.isNetworkActivityIndicatorVisible = true 
    let urlString = Constants.baseURL + Constants.apiURL + Constants.loginUrl 
    let params:Dictionary<String, AnyObject> = [ 
     "facebook_id": facebookID as AnyObject 
    ] 

    Alamofire.request(urlString, method: .post, parameters: params, encoding: JSONEncoding.default) 
     .validate() 
     .responseJSON { response in 
      switch response.result { 
      case .success: 
       let userjson = JSON(data: response.data!) 
       let results = userjson["results"].dictionaryValue 
       guard let auth_token = results["token"]?.string, 
        let userid = results["id"]?.int, 
        let firstname = results["first_name"]?.string, 
        let lastname = results["last_name"]?.string, 
        let nickname = results["nickname"]?.string, 
        let city = results["city"]?.string, 
        let photo = results["photo_url"]?["url"]else{ 

         //nil 
        return 
       } 

       //The Process will not continue from here if the JSON response has a null value) 

       self.userdefault.saveUserToken(authToken: auth_token) 
       self.userdefault.setUserID(userID: userid) 
       self.userdefault.setuserFirstName(userFName: firstname) 
       self.userdefault.setuserLastName(userLName: lastname) 
       self.userdefault.setuserNickName(userNName: nickname) 
       self.userdefault.setuserCity(userCity: city) 

       self.GotoMainNavigation() 

      case .failure(let error): 
       print("susb \(error)") 

       self.getFacebookInfo() 

      } 
      UIApplication.shared.isNetworkActivityIndicatorVisible = false 
    } 

} 

答えて

0

あなたguard式は完全に罰金され、最後の行を除いてすべてnull値をフィルタリングしていただきありがとうございます。 urlを仮定しても、あなたが

let photo = results["photo_url"]?["url"]?.string ... 

を確認したがすべてオプションのバインディングが成功した場合guard式は唯一の真に評価されることを考慮しなければならない文字列です。例えば

photo値は後のガード表現、それを入れて、nilの合体演算子を使用し、オプションのことになっている場合:

let photo = results["photo_url"]?["url"]?.string ?? "" 
0
data =  { 
     results =   { 
      resultsData =    (
           { 
        a = "A"; 
        b = "B"; 
        c = "C": 
       } 
      ); 
     }; 
}; 

ガードはに実行を必要とする新しい条件文であります条件が満たされない場合は、現在のブロックを終了します。ガードステートメントの条件で作成された新しいオプションのバインディングは、残りの関数またはブロックで使用できます。必須のelseは、現在のスコープを終了する必要があります。returnを使用して関数を終了し、ループ内で続行または中断、または@noreturn関数

guard let data = response["data"] as? [String:AnyObject],let resultsObj = response["results"] as? [String:AnyObject],let resultsData = results["resultsData"] as? [String:AnyObject] else{ 

    return 
} 
+0

"a"がnullの場合はどうなりますか?ガードはもう一方の値を返しますか? – vidalbenjoe

+0

これをチェック: - [http://stackoverflow.com/questions/34051886/swift-guard-else-called-on-dictionary-key-with-null-value] – nick

+0

@vidalbenjoeそれはあなたに役立つ場合にマーク – nick

関連する問題