[swift-dev] Optional to String conversion

Andrew Trick atrick at apple.com
Sat Dec 5 00:21:31 CST 2015


> On Dec 4, 2015, at 10:05 PM, Dmitri Gribenko <gribozavr at gmail.com> wrote:
> 
> On Fri, Dec 4, 2015 at 10:00 PM, Andrew Trick <atrick at apple.com> wrote:
>> I’m adding runtime functionality to support optional casts and ran into some Optional to String conversion behavior that is currently somewhat accidental—it will break when I add functionality. I want to understand the desired behavior before doing extra work to fix it.
>> 
>> Currently swift does this:
>> 
>>> print(Int?(3))
>> Optional(3)
>>> print(String?("meow"))
>> Optional("meow")
>> 
>> I think swift should do this:
>> 
>>> print(Int?(3))
>> 3
>>> print(String?("meow"))
>> "meow"
>>> debugPrint(Int?(3))
>> Optional(3)
>>> debugPrint(String?("meow"))
>> Optional("meow")
>> 
>> When a value already knows how to represent itself as a string, I don't think that the string "Optional" belongs in the textual representation.
>> 
>> When debugging data structures, it makes sense to include the "Optional" indicator.
>> 
>> What was the intention here and what do people think is the desired behavior?
> 
> This behavior was not accidental.  Here's the rationale:
> 
> If an Optional is nil, it should somehow indicate that.  Whatever the
> representation is, it would be engineer-oriented and not suitable for
> end users.  Thus, Optional should never be printed to users, it would
> only ever be presented to engineers, and thus its print() and
> debugPrint() representations should be the same.
> 
> Dmitri

I think you're saying that it's the programmer's responsibility not to construct a user-visible String from an Optional.

By accidental, I mean that Optional does not conform to CustomStringConvertible. If we want "Optional" to be part of the string conversion, then this conformance needs to exist, or I need to add some special handling of Optional. Do you see any problem with me adding that conformance?

Incidentally, when *do* we want debug string conversion to deviate? Or is it just a customization point we anticipate to be useful?

Andy


More information about the swift-dev mailing list