Поток 10. Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь позвонить в службу поддержки, чтобы получить информацию о пользователе, однако я получаю эту ошибку:

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

Из этого кода:

    let urlString = "http://myURL.com/getInfo/getAccountTransactions/{accountPublicKey}"
    print(urlString)
    let requestUrl = URL(string:urlString)
    let requestURL = URLRequest(url:requestUrl!)

Когда я обертываю код в стороже, пусть код не выполняется, потому что он находит nil, я не уверен почему, потому что строка URL никогда не может быть nill, так как она инициализируется значением по умолчанию для того же кода.

Этот код в карауле пусть:

    let urlString = "http://myURL.com/getInfo/getAccountTransactions/{accountPublicKey}"
    guard let requestUrl = URL(string:urlString) else { return }
    let requestURL = URLRequest(url:requestUrl)

Это весь код вызова службы:

class TransactionServiceCall : NSObject, URLSessionDelegate{

let viewResponse = ThrowResponse()

func fetchTransactions(requestObject: Transaction, completion: @escaping (Dictionary<String,Any>?) -> Void) {
    let urlString = "http://myURL.com/getInfo/getAccountTransactions/{accountPublicKey}"

    guard let requestUrl = URL(string:urlString) else { return }
    let requestURL = URLRequest(url:requestUrl)

    let searchParams = Transaction.init(publicKey: requestObject.publicKey)
    var request = requestURL
    request.httpMethod = "POST"
    request.httpBody = try?  searchParams.jsonData()
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    let session = URLSession.shared

    let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
        do {
            let httpResponse = response as! HTTPURLResponse
            let statusCode = httpResponse.statusCode

            if 200 ... 299 ~= statusCode {
                if let json = try JSONSerialization.jsonObject(with: data!) as? Dictionary<String,Any> {
                    self.viewResponse.dismissLoader()
                    print(json)
                    completion(json)
                }
            }else{
                self.viewResponse.dismissLoader()
                self.viewResponse.showFailureAlert(title: "Failure", message: "")
                completion(nil)
            }
        } catch {
            DispatchQueue.main.async {
                self.viewResponse.dismissLoader()
                self.viewResponse.showFailureAlert(title: "Failure", message: "")
                completion(nil)
            }
        }
    })

    task.resume()

  }

}

Важно отметить, что URL содержит фигурные скобки, например,

http://myURL.com/getInfo/getAccountTransactions/{accountPublicKey}

1 Ответ

0 голосов
/ 29 апреля 2018

Вам нужно экранировать специальные символы в URL string, используя addingPercentEncoding(withAllowedCharacters:) и соответствующий CharacterSet, чтобы из него можно было создать действительный URL объект.
В вашем случае CharacterSet должно быть .urlQueryAllowed

Вот так:

//The unescaped string
let unescaped = "http://myURL.com/getInfo/getAccountTransactions/{accountPublicKey}"

//The escaped string
let escaped = unescaped.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

//...
...