<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class="">On Oct 3, 2016, at 5:49 PM, Kevin Ballard via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">
<title class=""></title>
<div class=""><div class="">On Mon, Oct 3, 2016, at 03:18 PM, Jordan Rose wrote:<br class=""></div>
<blockquote type="cite" class=""><div class=""><blockquote type="cite" class=""><div class=""><br class=""></div>
</blockquote></div>
</blockquote></div></div></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class="">...</blockquote></blockquote></blockquote><blockquote type="cite" class=""><blockquote type="cite" class=""><blockquote type="cite" class=""><br class=""></blockquote></blockquote></blockquote><blockquote type="cite" class=""><div class=""><div class=""><blockquote type="cite" class=""><div class="">We had this at one point, but we took it out because people would forget to test the nil case. I think `?? ""` or `?? nil` really is the best answer here.<br class=""></div>
</blockquote><div class=""><br class=""></div>
<div class="">But you can't write that, unless you're dealing specifically with an Optional<String>. If you try you'll get an error:<br class=""></div>
<div class=""><br class=""></div>
<div class=""><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;">unnamed.swift:2:19: error: binary operator '??' cannot be applied to operands of type 'Int?' and 'String'</span><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;"><br class=""></span></div>
<div class=""><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;"> print("x: \(x ?? "nil")")</span><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;"><br class=""></span></div>
<div class=""><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;"> ~ ^ ~~~~~</span><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;"><br class=""></span></div>
<div class=""><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;">unnamed.swift:2:19: note: overloads for '??' exist with these partially matching parameter lists: (T?, @autoclosure () throws -> T), (T?, @autoclosure () thro</span><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;"><br class=""></span></div>
<div class=""><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;">ws -> T?)</span><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;"><br class=""></span></div>
<div class=""><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;"> print("x: \(x ?? "nil")")</span><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;"><br class=""></span></div>
<div class=""><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;"> ^</span><span class="font" style="font-family: menlo, consolas, monospace, sans-serif;"><br class=""></span></div>
<div class="">This leads to writing code like "… \(x.map(String.init(describing:)) ?? "nil")" which is pretty gross.<br class=""></div>
</div></div></blockquote><br class=""></div><div>I think that if we'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 <font face="Menlo" class="">??</font> operator with a <font face="Menlo" class="">(T?, String) -> _StringInterpolationSomething</font> signature that works only in a string interpolation context.</div><div><br class=""></div><div>There are some types that aren't trivially constructible, or don'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're going to make people provide an alternative for optionals in this otherwise simple-to-use construct, let's make it simple to do so.</div><br class=""><div class="">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.</div><div class=""><br class=""></div><div class="">Nate</div><div class=""><br class=""></div></body></html>