You could encapsulate the type in a Swift overlay: annotate the C type as swift_private (NS_REFINED_FOR_SWIFT) at its declaration, then on the Swift side write a wrapper type that's non-copyable:
Where __demo_data_destroy() and __demo_data_run() are hypothetical interfaces from C that operate on the C type and which have also been marked swift_private.
Got it. Although I prefer to annotate directly in C header via NS_SWIFT_NAME instead of adding a Swift overlay. This is indeed a more flexible way to solve my problem currently.
You can apply NS_REFINED_FOR_SWIFT to the type declaration too, so that in C it is named Demo and code can directly use it, while in Swift it is renamed __Demo and code works with the Swift wrapper instead (which appears, to calling code, to be exactly the same except Swiftier.)