Подтвердить что ты не робот

Преобразование данных в строку в Swift 3

Я очень новичок в Swift.

Я хочу создать что-то вроде API в Swift для моего образовательного приложения.

У меня есть этот код:

    static func getFilm(filmID: Int) -> String {

    print("getFilm")

    let url = URL(string: "https://api.kinopoisk.cf/getFilm?filmID=\(filmID)")!
    var request = URLRequest(url: url)

    var returnData: String = ""

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        if var responseVar = response, var dataVar = data {
            print(responseVar)
            returnData = String(data: dataVar, encoding: .utf8)
        } else {
            print(error)
        }
    }

    task.resume()

    return returnData
}

И я пытаюсь преобразовать данные в строку в этой строке: returnData = String(data: dataVar, encoding: .utf8)

Компилятор Swift дает мне ошибку и меняет эту строку на returnData = String(data: dataVar, encoding: .utf8)! , когда я выполняю эту строку, я получаю пустую переменную returnData.

Если я использую базовую строку примера print(String(data: data, encoding: .utf8)) все будет ОК, и я вижу data в консоли XCode.

Итак, как я могу преобразовать данные в строку?

4b9b3361

Ответ 1

Это пример использования обработчика завершения:

class func getFilm(filmID: Int, completion: @escaping (String) -> ()) {
    let url = URL(string: "https://api.kinopoisk.cf/getFilm?filmID=\(filmID)")!

    URLSession.shared.dataTask(with:url) { (data, response, error) in
      if error != nil {
        print(error!)
        completion("")
      } else {
        if let returnData = String(data: data!, encoding: .utf8) {
          completion(returnData)
        } else {
          completion("")
        }
      }
    }.resume()
}

И вы называете это

MyClass.getFilm(filmID:12345) { result in
   print(result)
}

В случае ошибки обработчик завершения возвращает пустую строку.

MyClass - это класс включения метода getFilm. Скорее всего, веб-служба вернет JSON, поэтому вам может потребоваться десериализация JSON в массив или словарь.


В более сложной версии создайте перечисление с двумя случаями и связанными значениями

enum ConnectionResult {
  case success(String), failure(Error)
}

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

class func getFilm(filmID: Int, completion: @escaping (ConnectionResult) -> ()) {
    let url = URL(string: "https://api.kinopoisk.cf/getFilm?filmID=\(filmID)")!

    URLSession.shared.dataTask(with:url) { (data, response, error) in
      if error != nil {
        completion(.failure(error!))
      } else {
        if let returnData = String(data: data!, encoding: .utf8) {
          completion(.success(returnData))
        } else {
          completion(.failure(NSError(domain: "myDomain", code: 9999, userInfo: [NSLocalizedDescriptionKey : "The data is not converible to 'String'"])))
        }
      }
    }.resume()
}

На стороне вызывающего абонента оператор switch отделяет случаи.

MyClass.getFilm(filmID:12345) { result in
    switch result {
    case .success(let string) : print(string)
    case .failure(let error) : print(error)
    }
}