The problem here is that task
is executed asynchronously, so your getHeaderInformations
function exits before content
is ever set. (The block that sets content
will be called some time later when the network request completes. You should also check the error
parameter passed into this block, because at the moment you'll never know if there is an error.
You basically have two options:
- If you're not running on the main thread, you could convert
getHeaderInformations
to be synchronous. See Can I somehow do a synchronous HTTP request via NSURLSession in Swift for how to do that.
- Otherwise, you can convert the code that calls
getHeaderInformations
to also be asynchronous. To do that you would do something like the following.
Somewhere in your code you call getHeaderInformations
and do something with the result.
let header = getHeaderInformations(myUrl: someURL)
// Do something with header...
Instead you rewrite getHeaderInformation
to look like this:
func getHeaderInformations (myUrl: URL, completionHandler: @escaping (_ content: String, _ error: Error?) -> Void) -> Void {
var request = URLRequest(url: myUrl)
request.httpMethod = "HEAD"
let task = URLSession.shared.dataTask(with: request) {data, response, error in
if let reponse = response as? HTTPURLResponse{
let contentType = reponse.allHeaderFields["Content-Type"]
let contentLength = reponse.allHeaderFields["Content-Length"]
let content = String(describing: contentType) + "/" + String(describing: contentLength)
completionHandler(content, error)
}
}
task.resume()
}
This adds a completion handler which will be called when the network request finishes. You would then alter the code that calls it to look like this:
getHeaderInformations(myUrl: url) { header, error in
guard let unwrappedError = error else {
// handle error
return
}
// do something with header...
}
Note: I'm using trailing closure syntax here which you did not use in your example. If you're not sure about it see Trailing Closures