Tell me about Sendable types and how they fit into the concurrency world
Asked on 2026-02-24
1 search
Sendable types are an important concept in Swift concurrency, designed to ensure safe data sharing across concurrent tasks. The Sendable protocol in Swift marks types that are safe to share between different threads or tasks. When a type conforms to Sendable, it guarantees that its instances can be safely used in concurrent contexts without causing data races.
Here are some key points about Sendable types and their role in Swift concurrency:
-
Value Types: Many basic Swift types, such as strings, integers, and dates, are value types and inherently safe to share across threads. Collections like arrays and dictionaries are also value types and can be sendable when their elements are sendable.
-
Conditional Conformance: Collections like arrays define conditional conformances to
Sendable, meaning they are sendable when their elements are sendable. -
Actors: Actors in Swift are designed to protect mutable state by ensuring that only one task can access the state at a time. Actors are inherently sendable, allowing actor objects to be shared safely across concurrent tasks.
-
Main Actor: Types associated with the main actor are implicitly sendable, which means you don't need to explicitly mark them as sendable.
-
Concurrency Safety: The Swift compiler checks for sendability whenever data is passed between actors and tasks, helping to prevent data races and ensuring concurrency safety.
-
Classes and Closures: Classes and closures can involve mutable state that is not safe to share concurrently. Therefore, they should be used from one task at a time unless they are explicitly made sendable.
For more detailed information on Sendable types and their use in Swift concurrency, you can refer to the session Embracing Swift concurrency (16:56) from WWDC 2025.

Embracing Swift concurrency
Join us to learn the core Swift concurrency concepts. Concurrency helps you improve app responsiveness and performance, and Swift is designed to make asynchronous and concurrent code easier to write correctly. We’ll cover the steps you need to take an app through from single-threaded to concurrent. We’ll also help you determine how and when to make the best use of Swift concurrency features – whether it’s making your code more asynchronous, moving it to the background, or sharing data across concurrent tasks.

Code-along: Elevate an app with Swift concurrency
Learn how to optimize your app’s user experience with Swift concurrency as we update an existing sample app. We’ll start with a main-actor app, then gradually introduce asynchronous code as we need to. We’ll use tasks to optimize code running on the main actor, and discover how to parallelize code by offloading work to the background. We’ll explore what data-race safety provides, and work through interpreting and fixing data-race safety errors. Finally, we’ll show how you can make the most out of structured concurrency in the context of an app.

Explore concurrency in SwiftUI
Discover how SwiftUI leverages Swift concurrency to build safe and responsive apps. Explore how SwiftUI uses the main actor by default and offloads work to other actors. Learn how to interpret concurrency annotations and manage async tasks with SwiftUI’s event loop for smooth animations and UI updates. You’ll leave knowing how to avoid data races and write code fearlessly.
