<div dir="ltr">withExtendedLifetime(&amp;x) does extend the lifetime of &amp;x, it just doesn&#39;t extend the lifetime of x.<div><br></div><div>However, withExtendedLifetime(x) does extend the lifetime of x by holding a strong reference (if it&#39;s a reference type), which can be useful. Maybe withExtendedLifetime should be changed to &lt;T: AnyObject&gt; rather than &lt;T&gt; ?</div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><div dir="ltr"><div>Jacob<br></div></div></div></div>
<br><div class="gmail_quote">On Wed, Dec 16, 2015 at 2:07 PM, Michael Gottesman via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@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 Dec 16, 2015, at 2:22 PM, Dave Abrahams &lt;<a href="mailto:dabrahams@apple.com">dabrahams@apple.com</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt;&gt; On Dec 16, 2015, at 11:54 AM, Michael Gottesman via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On Dec 16, 2015, at 1:49 PM, Kevin Ballard via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Another replacement for withUnsafe[Mutable]Pointer is declaring a nested function of the appropriate type (this is equivalent to the anonymous closure, but perhaps more readable):<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; func foo(ptr: UnsafePointer&lt;Int&gt;) {<br>
&gt;&gt;&gt;  // ...<br>
&gt;&gt;&gt; }<br>
&gt;&gt;&gt; foo(&amp;x)<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; -Kevin<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On Wed, Dec 16, 2015, at 11:38 AM, Kevin Ballard wrote:<br>
&gt;&gt;&gt;&gt; # Introduction<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; The stdlib provides functions withUnsafePointer() and withUnsafeMutablePointer() (and plural variants) that take an inout reference and call a block with the UnsafePointer/UnsafeMutablePointer created from the reference.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; # Problem<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; withUnsafePointer() can only be used with mutable variables, because those are the only things that can be used with inout &amp;refs. Both functions are also fairly useless, as &amp;x refs can be passed directly to functions taking an UnsafePointer or UnsafeMutablePointer. The existence of the functions mostly just causes people to think they&#39;re necessary when they&#39;re not. The provide no functionality that passing &amp;x refs directly to the functions taking a pointer doesn&#39;t already fulfill.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; # Solution<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; Remove the functions from the stdlib. The Swift Book should also be updated to talk about passing an &amp;x ref to a function that takes an UnsafePointer or UnsafeMutablePointer (but of course changes to the book are not covered by the open-source project). Most uses of these functions can probably be replaced with a &amp;x ref directly. If any can&#39;t, they could be replaced with the following equivalent expressions:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; { (ptr: UnsafePointer&lt;Int&gt;) in<br>
&gt;&gt;&gt;&gt;  // ...<br>
&gt;&gt;&gt;&gt; }(&amp;x)<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; or:<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; withExtendedLifetime(&amp;x) { (ptr: UnsafePointer&lt;Int&gt;) in<br>
&gt;&gt;&gt;&gt;  // ...<br>
&gt;&gt;&gt;&gt; }<br>
&gt;&gt;<br>
&gt;&gt; One thing to keep in mind here is that with*Pointer and friends is also meant to enable one to work around issues with the optimizer if they come up in a convenient manner. I.e. imagine if one is attempting to process an image using a 5d array and for whatever reason, you are not getting the performance you need. Hopefully you would file a bug report and then use with*Pointer for your image processing loop.<br>
&gt;&gt;<br>
&gt;&gt; My fear about withExtendedLifetime is that the name is a misnomer. You are not extending the lifetime.<br>
&gt;<br>
&gt; What makes you say that?<br>
<br>
</span>Let me be more specific.<br>
<br>
My issue with the name &#39;withExtendedLifetime&#39; is that it is suggestive that the lifetime of &amp;x is being extended in a way that is different from if one just passed off &amp;x to any old function. In reality though, nothing special is happening here implying that the name is misleading. A better name IMO would be something that drops any such implication.<br>
<br>
Michael<br>
<div class="HOEnZb"><div class="h5"><br>
&gt;<br>
&gt; If in fact it is true, shouldn&#39;t you file a bug report?<br>
&gt;<br>
&gt; -Dave<br>
&gt;<br>
&gt;<br>
&gt;<br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</div></div></blockquote></div><br></div></div>