1

昨日、Xcode 8.2 に更新したため、Swift 3.0 構文に更新する必要がありました。私のアプリには、次の機能があります。

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()
}

そして、私はこのエラーを受け取ります:

タイプ「(with: NSMutableURLRequest, completionHandler: (Data?, URLResponse?, NSError?) -> Void)」の引数リストで「dataTask」を呼び出すことはできません

誰かがそれを修正するのを手伝ってくれますか?

4

1 に答える 1

2

Swift 3 の場合は にチェックを入れると Batte になりますがApple Documentation、今では最初の引数としてdataTask(with:completionHandler:)取り、を に変更します。そのため、代わりにのインスタンスを作成し、変更も行いました。ほとんどのパブリック API を備えた Swift 3 では、. あまりにも使用する場合はバッター。URLRequestcompletionHandler(Data?, URLResponse?, Error?) -> VoidURLRequestNSMutableURLRequestcompletionHandlerNSErrorErrorError

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必要があります。データを受信して​​いるときに呼び出していない場合は、else ブロック内でnilデータ値としても呼び出す必要があります。

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

self.performGetRequest(url) { (data, status, error) in
    if error != nil {
        print(error?.localizedDescription)
        return
    }
    //Use data here
}
于 2016-12-15T14:41:10.447 に答える