Универсальный Decodable Protocol Swift 4.2 развернуть необязательная ошибка - PullRequest
0 голосов
/ 24 июня 2018

при наличии проблемы с универсальным декодируемым протоколом здесь, похоже, он возвращает необязательную ошибку развертывания. Я новичок в Swift, но я не знаю, почему он возвращается необязательно. Смотрите мой код ниже:

public func requestGenericData<T: Decodable>(urlString: String, httpMethod: String, token: String) -> T? {
    var result: T?
    let fullStringUrl: String = self.url + urlString
    let urlReq = URL(string: fullStringUrl)
    var urlRequest = URLRequest(url: urlReq!)
    urlRequest.setValue("application/json", forHTTPHeaderField: "accept")
    urlRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
    urlRequest.httpMethod = httpMethod
    URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
        if self.isInternetAvailable() {
            guard let data = data else { return }
            if let httpResponse = response as? HTTPURLResponse {
                if httpResponse.statusCode >= 200 && httpResponse.statusCode < 300 {
                    do {
                        let parsedObj = try JSONDecoder().decode(T.self, from: data)
                        result = parsedObj
                    } catch {
                        print("Error: \(String(describing: error))\n StatusCode: \(httpResponse.statusCode)")
                    }
                }
            }
        } else {
            showAlert(title: "No Internet Connect", message: "Please open your network and try again.", alertStyle: .alert, buttonTitle: "OK", buttonStyle: .default)
            return
        }
    }.resume()

    return result
}

Обновление: Ошибка

Поток 1: неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Вы можете обновить это, проверить возвращаемое значение true / false и затем использовать возвращаемое значение

public func requestGenericData<T: Decodable>(urlString: String, httpMethod: String, token: String,completion:@escaping(_ result:T?,_ success:Bool)-> Void) {

    let fullStringUrl: String = self.url + urlString
    let urlReq = URL(string: fullStringUrl)
    var urlRequest = URLRequest(url: urlReq!)
    urlRequest.setValue("application/json", forHTTPHeaderField: "accept")
    urlRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
    urlRequest.httpMethod = httpMethod
    URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
        if self.isInternetAvailable() {
            guard let data = data else { return }
            if let httpResponse = response as? HTTPURLResponse {
                if httpResponse.statusCode >= 200 && httpResponse.statusCode < 300 {
                    do {
                        let parsedObj = try JSONDecoder().decode(T.self, from: data)
                        completion(parsedObj,true)
                    } catch {
                        print("Error: \(String(describing: error))\n StatusCode: \(httpResponse.statusCode)")
                         completion(nil,false)
                    }
                }
            }
        } else {
            showAlert(title: "No Internet Connect", message: "Please open your network and try again.", alertStyle: .alert, buttonTitle: "OK", buttonStyle: .default)
             completion(nil,false)
        }
    }.resume()


}

//

назовите это

requestGenericData(urlString:<#url#>,httpMethod:<#httpMethod#>,token:<#token#>) { (result,success) in 

  if success {

  }
}
0 голосов
/ 24 июня 2018

URLSession.dataTask(with:completionHandler:) - это асинхронный метод.Ваша requestGenericData функция возвращает до того, как URLSession.dataTask даже вызовет обработчик завершения.Следовательно, ваша переменная result все равно будет nil, когда вернется requestGenericData.

Вам также необходимо сделать свою функцию асинхронной.Он должен взять обработчик завершения в качестве параметра и затем вызвать его из обработчика завершения URLSession.dataTask.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...