Structured concurrency: async let & TaskGroup
Unstructured Task {} has no parent
You've used Task { } since Module 3 β it's how synchronous code (a button's action, a delegate callback) jumps into async code. But a bare Task { } is unstructured: it starts running and nobody owns it. If the view that launched it disappears, the Task keeps going. If it throws, nothing automatically hears about it. It's a fire-and-forget bridge β fine for that job, wrong for chaining several async calls together.
Structured concurrency flips that: child tasks can't outlive the scope that created them. If the parent is cancelled or throws, every child is cancelled too, automatically. async let and TaskGroup are the two structured tools β this lesson is about the simpler one, async let, which is exactly right when you know in advance how many things you're running in parallel.