[swift-users] Passing Data to a f(void *) function

Martin R martinr448 at gmail.com
Fri Jun 30 09:32:49 CDT 2017


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.


My questions are:

1. Why are (A) and (B) treated differently?

2. Is (A) "legal", or should one use some non-void pointer

    data.withUnsafeBytes { (ptr: UnsafePointer<Int8>) in myfunc(ptr) } // (D)
    
   (which feels wrong to me because it is converted back to a void pointer when
   calling the function).

3. Or should there be a `withUnsafeRawPointer()` method which makes (C) compile as

      data.withUnsafeRawBytes { (ptr: UnsafeRawPointer) in myfunc(ptr) }

   This would also allow to access the data at byte offsets more easily, e.g.

       data.withUnsafeRawBytes { ptr in
           let u16 = ptr.load(fromByteOffset: 4, as: UInt16.self)
       }
    
   Does that makes sense?

Regards, Martin



    




 


More information about the swift-users mailing list