2016-12-15 5 views
1

어제 Xcode 8.2로 업데이트되어 Swift 3.0 구문으로 업데이트해야했습니다. 내 응용 프로그램에서 나는이 기능이 있습니다Swift3 문제 : 새로운 구문을 이해할 수 없습니다.

func performGetRequest(_ targetURL: URL!, completion:@escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: NSError?) -> Void) 
{ 
    let request = NSMutableURLRequest(url: targetURL) 
    request.httpMethod = "GET" 

    let sessionConfiguration = URLSessionConfiguration.default 

    let Session = URLSession(configuration: sessionConfiguration) 

    let tasksession = Session.dataTask(with: request, completionHandler: { (data: Data?, response: URLResponse?, error: NSError?) -> Void in 
     if data != nil{ 
      DispatchQueue.main.async(execute: {() -> Void in 
      completion(data: data, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error)}) 
     } 
     else 
     { 
      print("Connection Lost") 
     } 

    }) 
    tasksession.resume() 
} 

을 그리고 난이 오류를 얻을 :

Cannot invoke 'dataTask' with an argument list of type '(with: NSMutableURLRequest, completionHandler: (Data?, URLResponse?, NSError?) -> Void)'

는, 누군가를 해결하는 데 도움 것하세요? 당신이 Apple Documentation을 선택하면

+0

Xcode 8.2에서는 Swift 3.0으로 업데이트하도록 강요하지 않지만 Swift 2.3을 계속 사용할 수 있습니다. 그러나 Xcode 8.3을 사용하면 Swift 3.x로 이동할 수 있습니다. –

답변

2

스위프트 3의 경우는 축전지이다, 이제 dataTask(with:completionHandler:)는 첫 번째 인수로 URLRequest를 취할 것이며, completionHandler(Data?, URLResponse?, Error?) -> Void로 변경됩니다. 따라서 NSMutableURLRequest 대신 URLRequest 인스턴스를 만들고 completionHandler을 변경하십시오. Swift 3에서 공개 API의 대부분은 NSErrorError으로 변경했습니다. 그래서 타자라면 Error을 사용하십시오.

func performGetRequest(_ targetURL: URL!, completion:@escaping (_ data: Data?, _ HTTPStatusCode: Int, _ error: Error?) -> Void) { 

    let request = URLRequest(url: targetURL) 
    request.httpMethod = "GET" 

    let sessionConfiguration = URLSessionConfiguration.default 

    let Session = URLSession(configuration: sessionConfiguration) 

    let tasksession = Session.dataTask(with: request) { data, response, error in 
     if data != nil{ 
      DispatchQueue.main.async { 
       completion(data: data, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error) 
      } 
     } 
     else 
     { 
      print("Connection Lost") 
      DispatchQueue.main.async { 
       completion(data: nil, HTTPStatusCode: (response as! HTTPURLResponse).statusCode, error: error) 
      } 
     } 

    } 
    tasksession.resume() 
} 

참고 : 당신은 호출 할 필요가 당신의 당신은 데이터 값으로 nil와도 다른 블록 내부를 호출 할 필요가 nil 데이터를 수신 할 때 모든 가능한 방법으로 completionHendler, 당신이 그것을 호출하지 않았습니다.

편집 :이 기능을 다음과 같이 부를 수 있습니다.

self.performGetRequest(url) { (data, status, error) in 
    if error != nil { 
     print(error?.localizedDescription) 
     return 
    } 
    //Use data here 
} 
+0

고마워요 @Nirav D 도와 줘서 고맙지 만 다른 문제가 있습니다.이 함수를 performGetRequest라고 부릅니다. 다시 감사합니다. – bero

+0

@bero 현재 Mac을 사용할 수 없으므로 내일 도와 드리겠습니다. –

+0

그래, 괜찮아. 너를 기다리고있어 너의 도움을 많이 주셔서 감사합니다. – bero