Isolated conformances (IsolatedConformances)
Overview
Using an isolated conformance from outside the actor can cause data races in your program. Resolve these errors by only using isolated conformances within the actor.
A protocol conformance can be isolated to a specific global actor, meaning that the conformance can only be used by code running on that actor. Isolated conformances are expressed by specifying the global actor on the conformance itself:
protocol P {
func f()
}
@MainActor
class MyType: @MainActor P {
/*@MainActor*/ func f() {
// must be called on the main actor
}
}Swift will produce diagnostics if the conformance is directly accessed in code that isn’t guaranteed to execute in the same global actor. For example:
func acceptP<T: P>(_ value: T) { }
/*nonisolated*/ func useIsolatedConformance(myType: MyType) {
acceptP(myType) // error: main actor-isolated conformance of 'MyType' to 'P' cannot be used in nonisolated context
}To address this issue, mark the code as having the same global actor as the conformance it is trying to use. In this case, mark useIsolatedConformance as @MainActor so that the code is guaranteed to execute on the main actor.
An isolated conformance cannot be used together with a Sendable requirement, because doing so would allow the conformance to cross isolation boundaries and be used from outside the global actor. For example:
func acceptSendableP<T: P & Sendable>(_ value: T) { }
@MainActor func useIsolatedConformanceOnMainActor(myType: MyType) {
acceptSendableP(myType) // error: main-actor-isolated conformance of 'MyType' to 'P' cannot satisfy conformance requirement for 'Sendable' type parameter 'T'
}These errors can be addressed by either making the conformance itself nonisolated or making the generic function not require Sendable.
See Also
@dynamicCallable implementation requirements (DynamicCallable)Add @preconcurrency import (AddPreconcurrencyImport)Always enabled availability domains (AlwaysAvailableDomain)Argument matching for trailing closures (TrailingClosureMatching)Calling a mutating async actor-isolated method (ActorIsolatedMutatingAsync)Calling an actor-isolated method from a synchronous nonisolated context (ActorIsolatedCall)Captures in a `@Sendable` closure (SendableClosureCaptures)Compilation caching (CompilationCaching)Conforming to `StringInterpolationProtocol` (StringInterpolationConformance)Conversion from `@isolated(any)` function type to synchronous function type (ConversionFromIsolatedAnyToSynchronous)Cross-isolation data race (RegionIsolationCrossIsolationDataRace)Deprecated declaration warnings (DeprecatedDeclaration)Deprecated implementation-only imports (ImplementationOnlyDeprecated)Dynamic exclusivity (DynamicExclusivity)Embedded Swift language restrictions (EmbeddedRestrictions)