<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Oct 4, 2016 at 1:06 PM, Kevin Ballard 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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><u></u>




<div><span class="gmail-"><div>On Tue, Oct 4, 2016, at 10:44 AM, Mark Lacey wrote:<br></div>
<blockquote type="cite"><div><br></div>
<div><blockquote type="cite"><div>On Oct 4, 2016, at 10:29 AM, Kevin Ballard via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br></div>
<div><br></div>
<div><div><div>On Tue, Oct 4, 2016, at 10:28 AM, Nate Cook wrote:<br></div>
<blockquote type="cite"><div><blockquote type="cite"><div>On Oct 3, 2016, at 5:49 PM, Kevin Ballard via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br></div>
<div><br></div>
<div><div><div>On Mon, Oct 3, 2016, at 03:18 PM, Jordan Rose wrote:<br></div>
<blockquote type="cite"><div><blockquote type="cite"><div><br></div>
</blockquote></div>
</blockquote></div>
</div>
</blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">...<br></blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote></blockquote><blockquote type="cite"><div><div><blockquote type="cite"><div>We had this at one point, but we took it out because people would forget to test the nil case. I think `?? &quot;&quot;` or `?? nil` really is the best answer here.<br></div>
</blockquote><div><br></div>
<div>But you can&#39;t write that, unless you&#39;re dealing specifically with an Optional&lt;String&gt;.  If you try you&#39;ll get an error:<br></div>
<div><br></div>
<div><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif">unnamed.swift:2:19: error: binary operator &#39;??&#39; cannot be applied to operands of type &#39;Int?&#39; and &#39;String&#39;</span><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif"></span><br></div>
<div><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif">    print(&quot;x: \(x ?? &quot;nil&quot;)&quot;)</span><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif"></span><br></div>
<div><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif">                ~ ^  ~~~~~</span><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif"></span><br></div>
<div><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif">unnamed.swift:2:19: note: overloads for &#39;??&#39; exist with these partially matching parameter lists: (T?, @autoclosure () throws -&gt; T), (T?, @autoclosure () thro</span><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif"></span><br></div>
<div><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif">ws -&gt; T?)</span><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif"></span><br></div>
<div><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif">    print(&quot;x: \(x ?? &quot;nil&quot;)&quot;)</span><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif"></span><br></div>
<div><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif">                  ^</span><span class="gmail-m_-3251482401757876207font" style="font-family:menlo,consolas,monospace,sans-serif"></span><br></div>
<div>This leads to writing code like &quot;… \(x.map(String.init(<wbr>describing:)) ?? &quot;nil&quot;)&quot; which is pretty gross.<br></div>
</div>
</div>
</blockquote><div><br></div>
</div>
<div>I think that if we&#39;re going to add this warning we should make it possible to provide a string as an alternative. It seems like it should be possible to build a <span class="gmail-m_-3251482401757876207font" style="font-family:menlo">??</span> operator with a <span class="gmail-m_-3251482401757876207font" style="font-family:menlo">(T?, String) -&gt; _StringInterpolationSomething</span> signature that works only in a string interpolation context.<br></div>
<div><br></div>
<div>There are some types that aren&#39;t trivially constructible, or don&#39;t have clear alternatives for the nil case. Other times it might just not make sense to build a new instance simply to turn it into a string. If we&#39;re going to make people provide an alternative for optionals in this otherwise simple-to-use construct, let&#39;s make it simple to do so.<br></div>
<div><br></div>
<div>This is undoubtedly a more complex approach that could be considered separately, but I think it would be a valuable part of how developers could transition their code.<br></div>
</blockquote></div>
</div>
</blockquote><div><br></div>
<div>That’s definitely more complex, and seems like a completely orthogonal feature request.<br></div>
<div><br></div>
<blockquote type="cite"><div><div><blockquote type="cite"><br></blockquote><div>I like this idea. This combined with the warning for naively interpolating an Optional would be a good solution, because now when I see the warning I can trivially solve it with `?? &quot;nil”`.<br></div>
</div>
</div>
</blockquote><div><br></div>
<div>If you can suppress the warning with `as T?` (where T? is the type of the thing being warned on), you wouldn’t need a form that specifically printed “nil”, correct?<br></div>
</div>
</blockquote><div><br></div>
</span><div>How many times do I need to repeat myself? I&#39;m looking for a solution to the problem where printing Optionals sanely (e.g. no &quot;Optional(…)&quot; wrapper for .some values) is a PITA right now. Getting rid of the warning does not solve this problem. This is why I like Nate Cook&#39;s idea to enable `?? &quot;nil&quot;` in string interpolations, because it <i>does</i> solve my problem. And with this tool, now the warning on printing Optionals becomes useful because it tells me where to add `?? &quot;nil&quot;`. Getting rid of the warning without the ability to add `?? &quot;nil&quot;` is not helpful to me, because I don&#39;t want to print &quot;Optional(…)&quot;.<br></div></div></blockquote><div><br></div><div>I&#39;m confused. Why not just add this to your project?</div><div><br></div><div>```</div><div><div>extension Optional : CustomStringConvertible {</div><div>    public var description: String {</div><div>        guard let some = self else { return &quot;nil&quot; }</div><div>        return String(describing: some)</div><div>    }</div><div>}</div></div><div>```</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>
<div>-Kevin Ballard</div>
</div>

<br>______________________________<wbr>_________________<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/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
<br></blockquote></div><br></div></div>