let ns = await withCheckedContinuation { continuation in Task { @MainActor in let ns = NonSendable() continuation.resume(returning: ns) } }
Region based isolationの元でこれはエラーになるらしい。 ns
が MainActor に居るので resume
に渡せなくなる。 (edited)public struct CheckedContinuation<T, E: Error>: Sendable { public func resume(returning value: transferring T) }
こうすることで、渡せるようになる。 ただし、渡した後ろでは使えなくなる。@MainActor struct S { let ns: NonSendable func getNonSendable() -> transferring NonSendable { return NonSendable() } } nonisolated func f(s: S) async { let ns = s.getNonSendable() // okay; 'ns' is in a disconnected region }
(edited)