Swift 我正在使用下面的代码创建网络请求,但收到错误“;致命错误:在展开可选值“时意外发现nil”;

Swift 我正在使用下面的代码创建网络请求,但收到错误“;致命错误:在展开可选值“时意外发现nil”;,swift,Swift,我是swift新手,正在使用以下代码创建网络调用,但遇到“致命错误:在展开可选值时意外发现零”请帮助。这个代码的Objective C版本对我来说很好 class func request(withUrlString urlString: String) -> NSMutableURLRequest { let request = NSMutableURLRequest(url: URL(string: urlString)!) request.ad

我是swift新手,正在使用以下代码创建网络调用,但遇到“致命错误:在展开可选值时意外发现零”请帮助。这个代码的Objective C版本对我来说很好

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”中