[swift-dev] Optional to String conversion
Dmitri Gribenko
gribozavr at gmail.com
Sat Dec 5 00:26:08 CST 2015
On Fri, Dec 4, 2015 at 10:21 PM, Andrew Trick <atrick at apple.com> wrote:
>
>> 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.
No, the responsibility is not to display it to users. It is OK to e.g., log it.
> 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?
Yes, the same behavior should also apply to any user-defined type: if
there is only CustomDebugStringConvertible conformance, it should be
used for String(x) initialization.
> Incidentally, when *do* we want debug string conversion to deviate? Or is it just a customization point we anticipate to be useful?
For example, in String: the user-presentable representation is the
string itself, the engineer-oriented representation shows all special
characters as escape sequences.
Dmitri
--
main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if
(j){printf("%d\n",i);}}} /*Dmitri Gribenko <gribozavr at gmail.com>*/
More information about the swift-dev
mailing list