2016-09-23 3 views
1

내가 빠른 2.2에서 내 모든 프로젝트에이 코드를 사용하지만 8 엑스 코드 새로운 프로젝트 후 업데이트 엑스 코드를 만들 때이 코드오류 3

do { 


     let comURL = "mylinkhere"+"customer_key=\(self.customer_key)" 


     // NSLog("PostData: %@",post) 

     let regURL:NSURL = NSURL(string: comURL)! 


     //let postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)! 

     //let postLength:NSString = String(postData.length) 

     let request:NSMutableURLRequest = NSMutableURLRequest(url: regURL as URL) 
     request.httpMethod = "POST" 
     //request.HTTPBody = postData 
     //request.setValue(postLength as String, forHTTPHeaderField: "Content-Length") 
     request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
     request.setValue("application/json", forHTTPHeaderField: "Accept") 

     var reponseError: NSError? 
     var response: URLResponse? 

     var urlData: NSData? 

     do { 
      urlData = try NSURLConnection.sendSynchronousRequest(request as URLRequest, returning:&response) as NSData? 
      // print(urlData) 
     } catch let error as NSError { 
      reponseError = error 
      urlData = nil 
     } 

     if (urlData != nil) { 

      let res = response as! HTTPURLResponse!; 

      //NSLog("Response code: %ld", res?.statusCode); 

      if ((res?.statusCode)! >= 200 && (res?.statusCode)! < 300) 
      { 
       let responseData:NSString = NSString(data:urlData! as Data, encoding:String.Encoding.utf8.rawValue)! 

       NSLog("Response Data ==> %@", responseData); 

       //var error: NSError? 

       let jsonData = try JSONSerialization.jsonObject(with: urlData! as Data, options: .allowFragments) as! [String:AnyObject] 




       self.Appstatus = (jsonData as AnyObject).value("android_app_status") as! NSString 



       self.StreamURL = (jsonData as AnyObject).value("android_streaming_url") as! NSString 

       //[jsonData[@"success"] integerValue]; 

       // NSLog("App Status2: %@", self.Appstatus); 
       // NSLog("App Stream URL2: %@", self.StreamURL); 

       if(self.Appstatus == "true") 

       { 


       } 

       else{ 

       } 


      } 

     } else { 
      let alertView:UIAlertView = UIAlertView() 
      alertView.title = "Sign in Failed!" 
      alertView.message = "Connection Failure" 
      if let error = reponseError { 
       alertView.message = (error.localizedDescription) 
      } 
      alertView.delegate = self 
      alertView.addButton(withTitle: "OK") 
      alertView.show() 
     } 

    } catch { 
     let alertView:UIAlertView = UIAlertView() 
     alertView.title = "Sign Up Failed!" 
     alertView.message = "Server Error!" 
     alertView.delegate = self 
     alertView.addButton(withTitle: "OK") 
     alertView.show() 
    } 
와 JSON 파일을 읽는에서이 문제를 직면

내가 제대로 응답을 가지고 있지만, 오류가

self.Appstatus = (jsonData as AnyObject).value("android_app_status") as! NSString 


self.StreamURL = (jsonData as AnyObject).value("android_streaming_url") as! NSString 

입니다

이 두 라인에 오류가 결과에서 데이터를 검색 할 때 : enter image description here

+0

귀하의 json 응답을 보여줍니다. –

+0

은 다음과 같습니다 : 응답 데이터 ==> { "android_streaming_url": "링크", "ios_streaming_url": "링크", "android_app_status": "true", "ios_app_status": "true"} –

+0

'[String : AnyObject]', 왜 이후에'jsonData as AnyObject'할까요? 그래서'self.Appstatus = (jsonData as [String : AnyObject]). 값 ("android_app_status")을! NSString ' – Larme

답변

2

가 스위프트 3에서 AnyObject 유형의 대부분은 사전 키에 대한 값을 얻을 수 valueForKey를 사용하지 않는 기본적으로

  • 스위프트

    Any

    로 변경되었습니다, 주요 구독을 사용합니다.

  • 캐스팅 한 후 유형을 캐스팅하지 마십시오 (비생산적인 효과를 나타냅니다).
  • 재단 NSString을 사용하지 마십시오. 스위프트 String을 사용하십시오.

키가 런타임 오류를 피하기 위해 사용을 선택 바인딩을 존재 보장하지 않는 경우

let jsonData = try JSONSerialization.jsonObject(with: urlData! as Data, options: .allowFragments) as! [String:Any] 
self.Appstatus = jsonData["android_app_status"] as! String 
self.StreamURL = jsonData["android_streaming_url"] as! String 

.

마지막으로 더 이상 사용되지 않는 동기 URL로드 API를 사용하지 마십시오.

+0

나는 이것을 시도하고 지금은 작동, 감사합니다 self.Appstatus = jsonData [ "ios_app_status"]로! 문자열 NSString으로 –

+0

썼습니다 : *** 재단'NSString' *** 사용하지 마십시오. 두 번째 캐스트 제거 – vadian

0

AnyStream에 jsonData를 타입 변환 할 필요가 없습니다. 코드에서 볼 수 있듯이 [String : AnyObject] 유형의 사전입니다. jsonData에서 문자열을 언랩하려면 다음 코드를 고려해보십시오. 와

if let appStatus = jsonData["android_app_status"] as? NSString{ 
    self.AppStatus = appStatus 
} 

이 안전이 사전이 "android_app_status"키가 나던 경우 프로그램도 충돌하지 않습니다 있는지 확인 할 수 있습니다 풀기.

희망이 도움이됩니다.