Networking with URLSession & async/await
Fetch real data from the web. You'll call URLSession.shared.data(from:) with async/await , decode JSON into Swift types with Codable , check HTTP status codes, and handle errors cleanly.
Learn Networking with URLSession & async/await in our free Swift course — a beginner-friendly interactive lesson with worked examples, a practice exercise…
Part of the free Swift course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.
What You'll Learn in This Lesson
1️⃣ Fetch and Decode
The core flow is three lines: build a URL , await the data, and decode it into a Codable model whose properties match the JSON keys.
Your turn. Fill in the protocol, the await keyword, and the decoder type.
2️⃣ Check the Status Code
A 404 or 500 still returns Data rather than throwing, so always cast to HTTPURLResponse and confirm the code is in the 200..<300 range before trusting the body.
3️⃣ Handle Errors
Networking can fail in two ways: the request itself ( URLError ) or the parsing ( DecodingError ). Catch them separately so you can show the right message.
Now you try. Fill in the error-handling keywords.
📋 Quick Reference
Write a full fetch that checks the status code and decodes a Todo, then report whether it's completed.
Practice quiz
Which URLSession method fetches data using async/await?
- URLSession.shared.data(from:)
- URLSession.fetch()
- URLSession.get()
- URLSession.load()
Answer: URLSession.shared.data(from:). data(from:) is the async method that returns (Data, URLResponse).
What does URLSession.shared.data(from:) return?
- Just Data
- A String
- A tuple of (Data, URLResponse)
- An Int status code
Answer: A tuple of (Data, URLResponse). It returns a tuple containing the response Data and the URLResponse.
Which protocol must a type adopt to be decoded from JSON?
- Hashable
- Decodable (or Codable)
- Equatable
- Identifiable
Answer: Decodable (or Codable). Decodable enables decoding; Codable is Decodable plus Encodable.
Which object turns JSON Data into a Swift value?
- JSONSerialization only
- JSONEncoder
- PropertyListDecoder
- JSONDecoder
Answer: JSONDecoder. JSONDecoder().decode(_:from:) decodes JSON Data into a Decodable type.
To read the HTTP status code, you cast the response to...
- URLRequest
- HTTPURLResponse
- URLComponents
- URLCache
Answer: HTTPURLResponse. Casting URLResponse to HTTPURLResponse exposes the statusCode.
Which status code range generally indicates success?
- 100–199
- 400–499
- 200–299
- 500–599
Answer: 200–299. 2xx codes indicate a successful HTTP response.
How do you handle errors from data(from:)?
- Use try/catch because it can throw
- Ignore them
- Use a guard with no try
- They never fail
Answer: Use try/catch because it can throw. data(from:) is async throws, so you call it with try inside a do/catch.
What does a URLError typically represent?
- A decoding mistake
- A nil optional
- A type cast error
- A networking failure such as no connection
Answer: A networking failure such as no connection. URLError describes networking-level failures like timeouts or no internet.
What does JSONDecoder throw on a shape mismatch?
- Nothing
- A DecodingError
- A URLError
- A fatalError
Answer: A DecodingError. Mismatched JSON throws a DecodingError such as keyNotFound or typeMismatch.
Why mark a fetching function async throws?
- For styling
- To run on the main thread
- So it can await the request and propagate failures
- To make it Sendable
Answer: So it can await the request and propagate failures. async lets it await the network call; throws lets it forward errors to the caller.