2017-04-04 1 views
0

Ich konvertiere meinen Code zu swift 3, aber im folgenden Code Fehler "Art des Ausdrucks ist mehrdeutig ohne mehr Kontext".Typ des Ausdrucks ist mehrdeutig ohne mehr Kontext in DataTask

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

    var request = URLRequest(url: targetURL) 
    request.httpMethod = "GET" 
    let sessionConfiguration = URLSessionConfiguration.default 
    let session = URLSession(configuration: sessionConfiguration) 
    let task = session.dataTask(with: request) { (data, response, error) in 
     DispatchQueue.main.async(execute: { 
      completion(data, response.statusCode,error) 
     }) 
    } 
    task.resume() 
} 

Antwort

1

Der Compiler will ErrorNSError nicht. Sie keine URLRequest in diesem Fall brauchen

open class func performGetRequest(_ targetURL: URL, completion: @escaping (Data?, Int, Error?) -> Void) { 

Endlich:

Weitere in Swift 3 auslassen die Parameterbezeichnungen in dem Handler Abschluss und nicht IUV * Parameter übergeben, wenn Sie tatsächlich nicht optionale bedeuten , GET ist der Standard, also übergeben Sie einfach die URL an dataTask und löschen Sie die zwei Zeilen, die sich auf die Anfrage beziehen.

(*) Implizite Unwrapped Optional

1

Es gibt zwei Probleme in Ihrem Code zuerst response.statusCode, Antworttyp von URLResponse ist und es hat Eigenschaft nicht statusCode so müssen Sie es HTTPURLResponse werfen geben Sie die statusCode zu bekommen . Zweitens ist von Swift 3 verwenden native Error anstelle von NSError, also wäre Ihr ganzer Code wie folgt.

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

    var request = URLRequest(url: targetURL) 
    request.httpMethod = "GET" 
    let sessionConfiguration = URLSessionConfiguration.default 
    let session = URLSession(configuration: sessionConfiguration) 
    let task = session.dataTask(with: request) { (data, response, error) in 
     DispatchQueue.main.async(execute: { 
      completion(data, (response as! HTTPURLResponse).statusCode,error) 
     }) 
    } 
    task.resume() 
} 
Verwandte Themen