[swift-evolution] [Proposal draft] Disallow Optionals in String Interpolation Segments

Robert Widmann devteam.codafi at gmail.com
Tue Oct 4 13:58:12 CDT 2016


It's an interesting idea that needs to be written down in a separate proposal and is tangentially related to the problem we are trying to solve here and now.  It is trivial to define this operator and was suggested by Charlie as new API to be added to Optional the last time improving Optionals in interpolation segments was discussed.  For now we're trying to keep it light and bugfix-esque.

~Robert Widmann

2016/10/04 13:29、Kevin Ballard via swift-evolution <swift-evolution at swift.org> のメッセージ:

> On Tue, Oct 4, 2016, at 10:28 AM, Nate Cook wrote:
>>> On Oct 3, 2016, at 5:49 PM, Kevin Ballard via swift-evolution <swift-evolution at swift.org> wrote:
>>> 
>>> On Mon, Oct 3, 2016, at 03:18 PM, Jordan Rose wrote:
>>>>> 
>>>>> ...
>>>>> 
>>>> 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.
>>> 
>>> But you can't write that, unless you're dealing specifically with an Optional<String>.  If you try you'll get an error:
>>> 
>>> unnamed.swift:2:19: error: binary operator '??' cannot be applied to operands of type 'Int?' and 'String'
>>>     print("x: \(x ?? "nil")")
>>>                 ~ ^  ~~~~~
>>> unnamed.swift:2:19: note: overloads for '??' exist with these partially matching parameter lists: (T?, @autoclosure () throws -> T), (T?, @autoclosure () thro
>>> ws -> T?)
>>>     print("x: \(x ?? "nil")")
>>>                   ^
>>> This leads to writing code like "… \(x.map(String.init(describing:)) ?? "nil")" which is pretty gross.
>> 
>> 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 ?? operator with a (T?, String) -> _StringInterpolationSomething signature that works only in a string interpolation context.
>> 
>> 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.
>> 
>> 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.
> 
> 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 `?? "nil"`.
> 
> -Kevin Ballard
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20161004/0d965694/attachment.html>


More information about the swift-evolution mailing list