[swift-users] Passing Data to a f(void *) function
Joe Groff
jgroff at apple.com
Fri Jun 30 11:14:35 CDT 2017
> On Jun 30, 2017, at 7:40 AM, Martin R via swift-users <swift-users at swift.org> wrote:
>
> I have a C function
>
> void myfunc(const void *ptr);
>
> which is imported to Swift as
>
> func myfunc(_ ptr: UnsafeRawPointer!)
>
> This compiles and runs without problems:
>
> let data = Data(bytes: [1, 2, 3, 4])
> data.withUnsafeBytes { (ptr) in myfunc(ptr) } // (A)
>
> and the type of `ptr` is inferred as `UnsafePointer<Void>`. But adding an explicit type
> annotation produces a compiler warning:
>
> data.withUnsafeBytes { (ptr: UnsafePointer<Void>) in myfunc(ptr) } // (B)
> // warning: UnsafePointer<Void> has been replaced by UnsafeRawPointer
>
> which is understandable in the view of "SE-0107 UnsafeRawPointer API".
>
> The "Fix-it" replaces `UnsafePointer<Void>` by `UnsafeRawPointer`, and that does not
> compile anymore:
>
> data.withUnsafeBytes { (ptr: UnsafeRawPointer) in myfunc(ptr) } // (C)
> // error: cannot convert value of type 'Void' to closure result type '_'
>
> because there is no `withUnsafeBytes()` method taking a `(UnsafeRawPointer)->ResultType`
> closure.
This is a bug. The Data API ought to be using UnsafeRawPointer here.
-Joe
More information about the swift-users
mailing list