SC #6: Petición web con async/await

Published: (January 17, 2026 at 10:05 AM EST)
1 min read
Source: Dev.to

Source: Dev.to

Código de ejemplo

func performPOSTURLRequest() async throws(NetworkingError) -> PostData {
  do {
    let request = try buildURLRequest()
    let (data, response) = try await URLSession.shared.data(for: request)

    guard let statusCode = (response as? HTTPURLResponse)?.statusCode else {
      throw NetworkingError.invalidStatusCode(statusCode: -1)
    }

    guard (200..<300).contains(statusCode) else {
      throw NetworkingError.invalidStatusCode(statusCode: statusCode)
    }

    let decodedResponse = try JSONDecoder().decode(PostResponse.self, from: data)
    print("The JSON response contains a name: \(decodedResponse.json.name) and an age: \(decodedResponse.json.age)")

    return decodedResponse.json

  } catch let error as EncodingError {
    throw .encodingFailed(innerError: error)
  } catch let error as DecodingError {
    throw .decodingFailed(innerError: error)
  } catch let error as URLError {
    throw .requestFailed(innerError: error)
  } catch let error as NetworkingError {
    throw error
  } catch {
    throw .otherError(innerError: error)
  }
}

Observaciones

  • El compilador avisa si no se ha retornado nada, algo que era imposible con la implementación basada en closures.
  • Aunque algunas partes del código lanzan errores de tipo NetworkingError, es necesario capturarlos explícitamente; de lo contrario, serán atrapados por el catch genérico.
  • URLSession.shared.data(for:) devuelve un valor no opcional cuando la petición es exitosa; en caso de error, lanza una excepción.
Back to Blog

Related posts

Read more »

SC #4: Sintaxis async/await

Declaración de funciones async/await Una función asíncrona debe marcarse con la palabra clave async. Si la función puede lanzar un error, se añade la palabra c...

SC #3: Relación con Swift 6

Swift Concurrency 3 Part Serieshttps://dev.to/david_goyes_a488f58a17a53/series/35092 'Swift Concurrency' fue los cimientos de Swift 6, sin embargo, Swift 6 defi...