Ответ 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)
}
}