<div dir="ltr"><div>I believe UnsafeRawPointer is a subtype of any UnsafePointer&lt;T&gt; type, so UnsafePointer&lt;T&gt;’s are always implicitly convertible to UnsafeRawPointers. So even the following compiles:<br><br><br><span style="font-family:monospace,monospace">import Foundation<br><br>func f(_ a:UnsafeRawPointer)<br>{<br><br>}<br><br>let data = Data(bytes: [1, 2, 3, 4])<br>data.withUnsafeBytes{ (ptr:UnsafePointer&lt;Range&lt;Int&gt;&gt;) in f(ptr) } </span><br><br></div>So annotate <span style="font-family:monospace,monospace">ptr</span> with its actual type, and it should just work.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 30, 2017 at 10:57 AM, Daniel Dunbar via swift-users <span dir="ltr">&lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
&gt; On Jun 30, 2017, at 7:40 AM, Martin R via swift-users &lt;<a href="mailto:swift-users@swift.org">swift-users@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; I have a C function<br>
&gt;<br>
&gt;    void myfunc(const void *ptr);<br>
&gt;<br>
&gt; which is imported to Swift as<br>
&gt;<br>
&gt;    func myfunc(_ ptr: UnsafeRawPointer!)<br>
&gt;<br>
&gt; This compiles and runs without problems:<br>
&gt;<br>
&gt;    let data = Data(bytes: [1, 2, 3, 4])<br>
&gt;    data.withUnsafeBytes { (ptr) in myfunc(ptr) } // (A)<br>
&gt;<br>
&gt; and the type of `ptr` is inferred as `UnsafePointer&lt;Void&gt;`. But adding an explicit type<br>
&gt; annotation produces a compiler warning:<br>
<br>
</span>How do you know the inferred type is `UnsafePointer&lt;Void&gt;`? I think it is more likely it is `UnsafePointer&lt;UInt8&gt;`, and the following compiles:<br>
```<br>
<span class="">let data = Data(bytes: [1, 2, 3, 4])<br>
</span>data.withUnsafeBytes { (ptr: UnsafePointer&lt;UInt8&gt;) in<br>
    myfunc(ptr)<br>
}<br>
```<br>
<br>
 - Daniel<br>
<div class="HOEnZb"><div class="h5"><br>
&gt;<br>
&gt;    data.withUnsafeBytes { (ptr: UnsafePointer&lt;Void&gt;) in myfunc(ptr) } // (B)<br>
&gt;    // warning: UnsafePointer&lt;Void&gt; has been replaced by UnsafeRawPointer<br>
&gt;<br>
&gt; which is understandable in the view of &quot;SE-0107 UnsafeRawPointer API&quot;.<br>
&gt;<br>
&gt; The &quot;Fix-it&quot; replaces `UnsafePointer&lt;Void&gt;` by `UnsafeRawPointer`, and that does not<br>
&gt; compile anymore:<br>
&gt;<br>
&gt;    data.withUnsafeBytes { (ptr: UnsafeRawPointer) in myfunc(ptr) } // (C)<br>
&gt;    // error: cannot convert value of type &#39;Void&#39; to closure result type &#39;_&#39;<br>
&gt;<br>
&gt; because there is no `withUnsafeBytes()` method taking a `(UnsafeRawPointer)-&gt;<wbr>ResultType`<br>
&gt; closure.<br>
&gt;<br>
&gt;<br>
&gt; My questions are:<br>
&gt;<br>
&gt; 1. Why are (A) and (B) treated differently?<br>
&gt;<br>
&gt; 2. Is (A) &quot;legal&quot;, or should one use some non-void pointer<br>
&gt;<br>
&gt;    data.withUnsafeBytes { (ptr: UnsafePointer&lt;Int8&gt;) in myfunc(ptr) } // (D)<br>
&gt;<br>
&gt;   (which feels wrong to me because it is converted back to a void pointer when<br>
&gt;   calling the function).<br>
&gt;<br>
&gt; 3. Or should there be a `withUnsafeRawPointer()` method which makes (C) compile as<br>
&gt;<br>
&gt;      data.withUnsafeRawBytes { (ptr: UnsafeRawPointer) in myfunc(ptr) }<br>
&gt;<br>
&gt;   This would also allow to access the data at byte offsets more easily, e.g.<br>
&gt;<br>
&gt;       data.withUnsafeRawBytes { ptr in<br>
&gt;           let u16 = ptr.load(fromByteOffset: 4, as: UInt16.self)<br>
&gt;       }<br>
&gt;<br>
&gt;   Does that makes sense?<br>
&gt;<br>
&gt; Regards, Martin<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; ______________________________<wbr>_________________<br>
&gt; swift-users mailing list<br>
&gt; <a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-users</a><br>
<br>
______________________________<wbr>_________________<br>
swift-users mailing list<br>
<a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-users</a><br>
</div></div></blockquote></div><br></div>