I'm trying to use NSImage with Tasks. Nominally that requires it be Sendable, but it is explicitly not Sendable for some reason:
@available(*, unavailable)
extension NSImage : @unchecked Sendable {
}
…even though it is explicitly 'sendable' if used correctly (i.e. not concurrently), and has critical use-cases which require it to be passed between threads. Note that I'm pointing to Apple's own documentation on these points, to emphasise the inconsistencies here.
I'm at a loss to come up with any workarounds which aren't absurd (e.g. saving the image to a file - even if only in-memory - and reconstituting it on the other thread). Since I don't control the type, I can't declare it Sendable. About the best I can think of is silliness like:
struct NSImageFixed: @unchecked Sendable {
let image: NSImage
}
…but please tell me there's a better way. 
(I did try searching this forum's archives, but there are so many topics about Sendable that I couldn't find any that aid in this matter, even though surely there must be plenty. I also searched Apple's Dev Forums and found plenty of people hitting the same issue yet no viable solutions)
1 Like
jrose
(Jordan Rose)
2
It’s not Sendable because it’s mutable, like every other mutable reference type. Your wrapper struct is the most correct answer short of [Returned for revision] SE-0414: Region-based isolation
1 Like
hborla
(Holly Borla)
3
With SE-0412 you can use a nonisolated(unsafe) local variable just before passing a value across isolation boundaries to suppress the Sendable check.
5 Likes
Thanks! (for pointing that out and to its authors @John_McCall & @sophia) That's more like what I was hoping for. I think that's a much more measured and reasonable solution to this sort of thing, than polluting the type system (so to speak).
I'm also hopeful that future enhancements in the vein of SE-414: Region based isolation will continue to alleviate some of the concurrency friction. (I don't think SE-414 applies in this particular case, I'm just talking more generally)
1 Like