Swift 我正在使用下面的代码创建网络请求,但收到错误“;致命错误:在展开可选值“时意外发现nil”;
我是swift新手,正在使用以下代码创建网络调用,但遇到“致命错误:在展开可选值时意外发现零”请帮助。这个代码的Objective C版本对我来说很好Swift 我正在使用下面的代码创建网络请求,但收到错误“;致命错误:在展开可选值“时意外发现nil”;,swift,Swift,我是swift新手,正在使用以下代码创建网络调用,但遇到“致命错误:在展开可选值时意外发现零”请帮助。这个代码的Objective C版本对我来说很好 class func request(withUrlString urlString: String) -> NSMutableURLRequest { let request = NSMutableURLRequest(url: URL(string: urlString)!) request.ad
class func request(withUrlString urlString: String) -> NSMutableURLRequest
{
let request = NSMutableURLRequest(url: URL(string: urlString)!)
request.addValue("application/json", forHTTPHeaderField:"Accept")
request.httpMethod = "GET"
request.timeoutInterval = 60
return request
}
class func send(_ request: URLRequest, completion callback: @escaping (_: Data, _: Error) -> Void)
{
if WebServiceManager.isInternetAvailable() == false
{
let data: NSData? = nil
callback(data as! Data, NSError(domain:kNetworkErrorMeassage, code:0, userInfo:nil))
return
}
// print("Request# \n URL : \(request.url?.absoluteString) \n Headers : \(request.allHTTPHeaderFields!.description) \n Request Method : \(request.httpMethod) \n Post body : \(request.httpBody ? try? JSONSerialization.jsonObject(withData: request.httpBody, options: []) : request.httpBody)\n")
// print("Request# \n URL : \(request.url?.absoluteString) \n Headers : \(request.allHTTPHeaderFields!.description) \n Request Method : \(request.httpMethod) \n Post body : \(request.httpBody ? String(data: request.httpBody!, encoding: String.Encoding.ascii) : request.httpBody)\n")
UIApplication.shared.isNetworkActivityIndicatorVisible = true
let dataTask : URLSessionDataTask? = URLSession.shared.dataTask(with: request) { (responseData, response, error) in
UIApplication.shared.isNetworkActivityIndicatorVisible = false
let httpResponce: HTTPURLResponse? = (response as? HTTPURLResponse)
let responseStatusCode: Int? = httpResponce?.statusCode
if responseStatusCode == 200 || responseStatusCode == 201 || responseStatusCode == 202
{
DispatchQueue.main.async(execute: {() -> Void in
callback(responseData!, error!)
})
}
else
{
DispatchQueue.main.async(execute: {() -> Void in
let data: NSData? = nil
callback(data as! Data, error!)
})
}
}
dataTask?.resume()
}
如果
dataTask
方法遇到错误,responseData
将为零。在这种情况下,错误
将为非零。在强制展开回调中的响应数据
之前,应确保检查错误
下面是一个代码示例:
class func send(_ request: URLRequest, completion callback: @escaping (_: Data, _: Error) -> Void) {
let dataTask : URLSessionDataTask? = URLSession.shared.dataTask(with: request) { (responseData, response, error) in
if let error = error {
// handle error
} else {
// now we know responseData is non-nil
UIApplication.shared.isNetworkActivityIndicatorVisible = false
let httpResponce: HTTPURLResponse? = (response as? HTTPURLResponse)
let responseStatusCode: Int? = httpResponce?.statusCode
if responseStatusCode == 200 || responseStatusCode == 201 || responseStatusCode == 202 {
DispatchQueue.main.async {
callback(responseData!, nil)
}
} else {
// ...
}
}
}
}
这里发生的第一件事是错误检查。之后,您可以安全地打开可选的responseData
。由于error
在本例中为nil,因此我将回调函数的error
变量更改为可选变量
我还为Dispatch.main.async
调用使用了尾部闭包语法,因为它使调用更具可读性
最后,在
else
子句(我的示例中未包含该子句)中,您创建了一个变量data
,该变量为nil,仅在一行之后强制强制转换它。。。这将永远崩溃。请仔细考虑您希望在这里实现的目标。到底是哪一行导致了问题?“let-dataTask:URLSessionDataTask?=URLSession.shared.dataTask(with:request){(responseData,response,error)在“i'm get error”中