2016-12-15 6 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の場合、それはbatteで、今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() 
} 

注:あなたはすべての可能な方法であなたのcompletionHendlerを呼び出す必要があなたはデータ値としてnilでも、他のブロック内で呼び出す必要がありnilデータを受信して​​いるとき、あなたはそれを呼び出していません。

編集:このようにこの関数を呼び出すことができます。

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

関連する問題