2016-12-21 6 views
-1

내 서버에서 JSON 데이터를 구문 분석하려고하는데 오류가 발생하여 try! 문에 충돌하여 충돌이 발생합니다. 그것은 나에게 말하고있다시도하십시오! Swift 3에서 치명적인 오류 발생 Swift 2에서 업데이트되는 문제

Code=3840 "Invalid value around character 0.

나뿐만에로 전환 될 때까지 내가 스위프트 내가 가장 긴 시간을 구문 분석 할 경우에 문제가 있고 있었다 3. 올바르게 내 코드를 업데이트하지 않았기 때문에 그것은 내 자리?

@IBAction func registerButtonTapped(_ sender: Any) { 

    let userEmail = userEmailTextField.text; 
    let userPassword = userPasswordTextField.text; 
    let userRepeatPassword = repeatPasswordTextField.text; 

    // Check for empty fields 
    if((userEmail?.isEmpty)! || (userPassword?.isEmpty)! || (userRepeatPassword?.isEmpty)!){ 

     //Display alert message 

     displayMyAlertMessage(userMessage: "All fields are required"); 

     return; 
    } 

    //Check if passwords matech 
    if(userPassword != userRepeatPassword){ 

     // Display alert message 
     displayMyAlertMessage(userMessage: "Passwords do not match"); 
     return; 
    } 

    // Send user data to server side 
    let myUrl = URL(string: "http://"); 
    let request = NSMutableURLRequest(url:myUrl!); 
    request.httpMethod = "Post"; 

    let postString = "email=\(userEmail)&password=\(userPassword)"; 

    //adding the parameters to request body 
    request.httpBody = postString.data(using: String.Encoding.utf8); 

    //creating a task to send the post request 
    let task = URLSession.shared.dataTask(with: request as URLRequest){ 
     data, response, error in 

     if error != nil{ 
      print("error=\(error)") 
      return 
     } 

     //parsing the reponse 

     //converting response to Any 
     let json = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments) as? [String:Any] 

     //parsing JSON 
     if let parseJSON = json{ 
      let resultValue = parseJSON["status"] as? String 
      print("result: \resultValue)") 

      var isUserRegistered:Bool = false; 
      if(resultValue=="Success") { isUserRegistered = true;} 

      var messageToDisplay:String = parseJSON["messsage"] as! String; 
      if(!isUserRegistered) 
      { 
       messageToDisplay = parseJSON["message"] as! String; 
      } 

      DispatchQueue.main.async { 

       //Display alert message with confirmation. 
       let myAlert = UIAlertController(title:"Alert", message:messageToDisplay, preferredStyle: UIAlertControllerStyle.alert); 

       let okAction = UIAlertAction(title:"ok", style:UIAlertActionStyle.default){ action in 
        self.dismiss(animated: true, completion:nil); 
       } 

       myAlert.addAction(okAction); 
       self.present(myAlert, animated:true, completion:nil); 
      }; 
     } 
    } 

    task.resume() 

} 

도와주세요

, 감사

+1

구문 분석하려는 json이 유효하지 않습니다! 'try! '를 사용하지 마십시오. JSONSerialization.jsonObject (...)'- 서버에 중단 시간/유지/유효한 오류가 발생하지 않는 오류가 발생하면 어떻게됩니까? 답변 : 앱이 다운됩니다 : ( – luk2302

+2

감탄 부호가 당신을 초대합니다 : * 제발 나를 추락 시키십시오! * 오류를 포착하는 것은 당신에게 달려 있습니다 .. 당신은 너무 많은 느낌표와 물음표를 사용하고 있습니다 ... – vadian

+2

[치명적인 오류 : 예기치 않게 찾지 옵션 값 "평균?"(http://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found-nil-while-unwrapping-an-optional-valu) (특히, 당신을 위해'try/try?/try!'에 관한 장.) – Moritz

답변

0

오류의 이유는 문자열 보간을 통해 서버에 문자 "Optional(Foo)" 문자열을 보내는 것입니다. userEmailuserPassword은 절대로 일치하지 않으며 서버는 데이터를 다시 보내지 않습니다. Swift 3에서는 암시 적으로 언 래핑 된 선택적 문자열까지 명시 적으로 래핑해야합니다.

이 솔루션은

@IBAction func registerButtonTapped(_ sender: AnyObject) { 

    // Check for empty fields 
    guard let userEmail = userEmailTextField.text, !userEmail.isEmpty, 
     let userPassword = userPasswordTextField.text, !userPassword.isEmpty, 
     let userRepeatPassword = repeatPasswordTextField.text, !userRepeatPassword.isEmpty else { 

      //Display alert message 
      displayMyAlertMessage(userMessage: "All fields are required") 
      return 
    } 
... 

지금 모든 관련 선택적 항목 안전하게 랩 해제하고 서버가 올바른 데이터를 얻을 것이다 옵션 바인딩 처리 방수 오류입니다.

는 또한 스위프트 필요와 스위프트 3

var request = URLRequest(url:myUrl!) // var is mandatory if properties are going to be changed. 

PS를 URLRequest보다는 NSMutableURLRequest를 사용하지 않는 if 조건 주위 세미콜론 괄호 후행 : - 이미 코멘트에 언급 - 어떤 경우를 결코 사용 서버로부터 데이터를 수신 할 때 부주의하게 try!.