[swift-evolution] Proposal: Deprecate optionals in string interpolation

Vladimir.S svabox at gmail.com
Thu May 19 06:26:08 CDT 2016


Strong +1 for the (at least) warning in case of optional in string 
interpolation.

Actually I think `Optional(something)` is a form of text representation for 
*debugging only*, not for 'production'. It is clear, that by default we 
need text representation for 'production', so it is logical for me that 
optional in string interpolation should return text without `Optional(..)`. 
Probably this means that optional should not have default .description for 
`production`, but just debugDescription for debugging.

So, for production you'll need to have:

let newURL = NSURL(string: "http://apple.com\(originalURL.path!)/help")
(or use ?? etc)

for debugging:
let newURL = NSURL(string: 
"http://apple.com\(originalURL.path.debugDescription)/help")


On 19.05.2016 10:39, Krystof Vasa via swift-evolution wrote:
> Consider the following example:
>
> let originalURL: NSURL = NSURL(string: "http://apple.com/iphone")!
> let newURL = NSURL(string: "http://apple.com\(originalURL.path)/help")
>
> What's the newURL? Nil, because it was being inited with
>
> http://apple.comOptional(/iphone)/help
> <http://apple.comoptional%28/iphone%29/help>
>
> Since the path property is optional.
>
> Which is not something you figure out until runtime, wondering why the URL
> is nil. This is very annoying when you run into this issue repeatedly on
> several occasions because you forget to unwrap the value.
>
> *This* is IMHO an undesired and unexpected behavior.
>
> If interpolating optionals did become a warning, you'd immediately know
> about a potential bug: you don't check if path != nil.
>
> BTW if you still want the original behavior of printing
>
> Optional(my string value),
>
> you can still write
>
> "http://apple.com\(originalURL.path.debugDescription)/help"
>
> which invokes debugDescription on the Optional, not the String (since there
> is no "?"), and you get the original value anyway. And this could be the
> Fix-It for it as well to maintain original behavior.
>
> Krystof
>
>> On May 19, 2016, at 9:28 AM, Dan Appel <dan.appel00 at gmail.com
>> <mailto:dan.appel00 at gmail.com>> wrote:
>>
>> You know what's worse than seeing "Optional(my string value)" in a label?
>> Seeing "nil". When the optional is there, it is made clear to the
>> developer that the string they are showing /can be nil/. However, if you
>> hide that from the users you are less likely to unwrap that optional and
>> hence more likely to show the user "nil". This behavior really goes
>> against some of the core ideas of Swift - you want your code to be
>> expressive but not abstract away potentially useful information.
>>
>> On Thu, May 19, 2016 at 12:24 AM David Waite
>> <david at alkaline-solutions.com <mailto:david at alkaline-solutions.com>> wrote:
>>
>>     Making string interpolation reject just optional (at compile time)
>>     when it doesn’t reject any other type sounds tricky to express.
>>
>>     What if instead Optional just didn’t decorate the wrapped value,
>>     outputting either the inner value or “nil” in these cases?
>>
>>     The debugDescription could remain "Optional(data)" style.
>>
>>     -DW
>>
>>>     On May 19, 2016, at 12:52 AM, Valentin via swift-evolution
>>>     <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>
>>>     From what I understand of this thread, the argument here is that
>>>     directly using an optional in a string interpolation is almost never
>>>     what you really want to do (except mainly for debugging purposes)
>>>     but you wouldn't see this mistake until much later at runtime.
>>>     And I feel like one of Swift goals is to enable us, imperfect human
>>>     creatures, to detect as many problems or mistakes as possible long
>>>     before runtime.
>>>
>>>     On 19 mai 2016, at 00:56, Dan Appel via swift-evolution
>>>     <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>
>>>>     -1.
>>>>
>>>>     Optional(foo) better depicts the actual type (it's an options
>>>>     string, after all). If you're not happy with it, just use the nil
>>>>     coalescing operator such as "\(foo ?? "")". This is from the same
>>>>     series of proposals as implicit casting - there are reasons it's
>>>>     done the way it is.
>>>>     On Wed, May 18, 2016 at 3:49 PM Jacob Bandes-Storch via
>>>>     swift-evolution <swift-evolution at swift.org
>>>>     <mailto:swift-evolution at swift.org>> wrote:
>>>>
>>>>         +1, personally I have taken to using `x+"str"+y` instead of
>>>>         `"\(x)str\(y)"`, if x/y are strings, so I can get a
>>>>         compile-time error if I do this accidentally.
>>>>
>>>>         But I do see the appeal of being able to print("the data:
>>>>         \(data)") for simple use cases. Didn't someone earlier propose
>>>>         some modifiers/labels like "\(describing: x)" ?
>>>>
>>>>
>>>>         On Wed, May 18, 2016 at 11:50 AM, Krystof Vasa via
>>>>         swift-evolution <swift-evolution at swift.org
>>>>         <mailto:swift-evolution at swift.org>> wrote:
>>>>
>>>>             The string interpolation is one of the strong sides of
>>>>             Swift, but also one of its weaknesses.
>>>>
>>>>             It has happened to me more than once that I've used the
>>>>             interpolation with an optional by mistake and the result is
>>>>             then far from the expected result.
>>>>
>>>>             This happened mostly before Swift 2.0's guard expression,
>>>>             but has happened since as well.
>>>>
>>>>             The user will seldomly want to really get the output
>>>>             "Optional(something)", but is almost always expecting just
>>>>             "something". I believe this should be addressed by a
>>>>             warning to force the user to check the expression to
>>>>             prevent unwanted results. If you indeed want the output of
>>>>             an optional, it's almost always better to use the ??
>>>>             operator and supply a null value placeholder, e.g.
>>>>             "\(myOptional ?? "<<none>>")", or use
>>>>             myOptional.debugDescription - which is a valid expression
>>>>             that will always return a non-optional value to force the
>>>>             current behavior.
>>>>
>>>>             Krystof
>>>>
>>>>             _______________________________________________
>>>>             swift-evolution mailing list
>>>>             swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>>             https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>
>>>>
>>>>         _______________________________________________
>>>>         swift-evolution mailing list
>>>>         swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>>         https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>
>>>>     --
>>>>     Dan Appel
>>>>     _______________________________________________
>>>>     swift-evolution mailing list
>>>>     swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>>     https://lists.swift.org/mailman/listinfo/swift-evolution
>>>     _______________________________________________
>>>     swift-evolution mailing list
>>>     swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>     https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>> --
>> Dan Appel
>
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>


More information about the swift-evolution mailing list