<div dir="ltr">What you're asking for is already possible (avoiding the optional unwrap) by combining map() on Optional with ??:<div><br></div><div>```</div><div><div>let name1: String? = "name"</div><div>print(name1.map { "\"\($0)\"" } ?? "null") // prints "\"name\""</div><div><br></div><div>let name2: String? = nil</div><div>print(name2.map { "\"\($0)\"" } ?? "null") // prints "null"</div><div>```</div><div><br></div><div>So I guess the question is, does simplifying that rise to the level of wanting a custom operator? I personally don't think it does, but I could see an argument being made that an operator with defined semantics might be a small amount clearer than map + ??. But I think the benefits would have to be very strong, though.</div><div><br></div><div>And as other folks have mentioned, having "!" in the operator name is somewhat misleading, since when I see that I expect a trap to occur in nil cases.</div><div><br></div><div><br></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Feb 8, 2017 at 6:04 AM Maxim Veksler via swift-evolution <<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Hello, <div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Let's assume I have an optional "name" parameter, based on the optional status of the parameters I would like to compose string with either the unwrapped value of name, or the string "null". The use case for is syntactic sugar to compose a GraphQL queries.<br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">A (sampled) illustration of the code that currently solves it looks as following:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><div class="gmail_msg"><font face="monospace" class="gmail_msg">func query(name: String?) {</font></div><div class="gmail_msg"><font face="monospace" class="gmail_msg"> <span style="color:rgb(5,0,0);font-size:9.75px;white-space:pre-wrap;background-color:rgb(255,254,254)" class="gmail_msg">let variables_name = name != nil ? "\"\(name!)\"" : "null"</span></font></div><div class="gmail_msg"><font face="monospace" class="gmail_msg"><span style="white-space:pre-wrap;background-color:rgb(255,254,254)" class="gmail_msg"> </span><span style="color:rgb(5,0,0);font-size:9.75px;white-space:pre-wrap;background-color:rgb(255,254,254)" class="gmail_msg">return "{ param: \(</span><span style="color:rgb(5,0,0);font-size:9.75px;white-space:pre-wrap;background-color:rgb(255,254,254)" class="gmail_msg">variables_name</span><span style="color:rgb(5,0,0);font-size:9.75px;white-space:pre-wrap;background-color:rgb(255,254,254)" class="gmail_msg">) }"</span></font></div><div class="gmail_msg"><span style="font-family:monospace;color:rgb(5,0,0);font-size:9.75px;white-space:pre-wrap;background-color:rgb(255,254,254)" class="gmail_msg">}</span><br class="gmail_msg"></div></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Based on optional status the following output is expected</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><font face="monospace" class="gmail_msg">let name = "Max"</font></div><div class="gmail_msg"><font face="monospace" class="gmail_msg">query(name: name) </font></div><div class="gmail_msg"><font face="monospace" class="gmail_msg">// { param: "Max" }</font></div><div class="gmail_msg"><font face="monospace" class="gmail_msg"><br class="gmail_msg"></font></div><div class="gmail_msg"><font face="monospace" class="gmail_msg">let name: String? = nil</font></div><div class="gmail_msg"><font face="monospace" class="gmail_msg">query(name: name)</font></div><div class="gmail_msg"><font face="monospace" class="gmail_msg">// { param: null }</font></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I think it might be useful to have an conditional unwrap operator <font face="monospace" class="gmail_msg">!?</font> that would enable syntax sugar uch as the following built into the language:</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><font face="monospace" class="gmail_msg">func query(name: String?) {</font></div><div class="gmail_msg"><font face="monospace" class="gmail_msg"> <span style="color:rgb(5,0,0);font-size:9.75px;white-space:pre-wrap;background-color:rgb(255,254,254)" class="gmail_msg">return "{ param: \(name !? "\"\(name)\"": "null") }"</span></font></div><div class="gmail_msg"><font face="monospace" class="gmail_msg"><span style="color:rgb(5,0,0);font-size:9.75px;white-space:pre-wrap;background-color:rgb(255,254,254)" class="gmail_msg">}</span><br class="gmail_msg"></font></div><div class="gmail_msg"><span style="color:rgb(5,0,0);font-family:'andale mono','lucida console',monospace;font-size:9.75px;white-space:pre-wrap;background-color:rgb(255,254,254)" class="gmail_msg"><br class="gmail_msg"></span></div><div class="gmail_msg"><span style="background-color:rgb(255,254,254)" class="gmail_msg"><font color="#050000" class="gmail_msg"><span style="white-space:pre-wrap" class="gmail_msg">This expression is expected to produce same output as the examples above. It means check the Optional state of </span></font></span><span style="font-family:monospace" class="gmail_msg">name: String?</span><span style="background-color:rgb(255,254,254)" class="gmail_msg"><font color="#050000" class="gmail_msg"><span style="white-space:pre-wrap" class="gmail_msg">, in case it has a value, unwrap it and make the unwrapped value accessible under the same name to the true condition part of the expression, otherwise return the </span></font></span><span style="color:rgb(5,0,0);white-space:pre-wrap;background-color:rgb(255,254,254)" class="gmail_msg">false </span><span style="white-space:pre-wrap;color:rgb(5,0,0);background-color:rgb(255,254,254)" class="gmail_msg">condition part of the expression.</span></div><div class="gmail_msg"><span style="background-color:rgb(255,254,254)" class="gmail_msg"><font color="#050000" class="gmail_msg"><span style="white-space:pre-wrap" class="gmail_msg"><br class="gmail_msg"></span></font></span></div><div class="gmail_msg"><font color="#050000" class="gmail_msg"><span style="background-color:rgb(255,254,254)" class="gmail_msg"><span style="white-space:pre-wrap" class="gmail_msg">The effectively removes the need to have the "if != nil" and the forced unwrap syntactical code, and IMHO improves code readability and expressiveness.</span></span></font></div><div class="gmail_msg"><font color="#050000" class="gmail_msg"><span style="background-color:rgb(255,254,254)" class="gmail_msg"><span style="white-space:pre-wrap" class="gmail_msg"><br class="gmail_msg"></span></span></font></div><div class="gmail_msg"><div class="gmail_msg">I'm wondering what the community thinks of the displayed use case, and proposed solution?</div><div class="gmail_msg"><br class="gmail_msg"></div></div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><font color="#050000" class="gmail_msg"><span style="background-color:rgb(255,254,254)" class="gmail_msg"><span style="white-space:pre-wrap" class="gmail_msg">-m</span></span></font></div></div>
_______________________________________________<br class="gmail_msg">
swift-evolution mailing list<br class="gmail_msg">
<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
</blockquote></div></div></div>