Sorry, didn't have time to actually submit the proposal, but it at least gave 
me some time to think it through a few more times.

After reconsiderations, I suggest the following:

- deprecation of interpolation of optionals.
- extending the Optional type by:
        - var detailedDescription: String - which will return the same value as 
until now: "nil" for nil and "Optional(value)" for .some(_). This is due to 
.description and .debugDescription's documentation discouraging direct 
invocation.

        - func descriptionWithDefaultValue(_ defaultValue: String = "nil") -> 
String - which would return either the description of the value, or 
`defaultValue`.

So, when the compiler runs into interpolation of an Optional, it issues a 
warning with a fix-it, that by default calls .descriptionWithDefaultValue() on 
the optional.

Person who wants the original behavior can still get it using 
`.detailedDescription`.

I'll put it into a proper proposal tomorrow.

> On May 27, 2016, at 2:23 PM, Vladimir.S <sva...@gmail.com> wrote:
> 
> I believe the only 'fix' here is to prevent string interpolation for anything 
> that is not base types like String, Integer, Double, Boolean or that is 
> explicitly provides textual(not for debugging) representation.
> 
> For all others like function, Optional etc leave only debug string 
> interpolation, when we should explicitly ask "get debgug info text for this 
> item".
> 
> I.e. in my opinion we shouldn't be able to do "\(url.lowercased)" or "\(op)" 
> (if `op` is optional).
> 
> But, *at least* we need warnings if optional, function or something like this 
> is in string interpolation.
> 
> On 27.05.2016 11:17, Charlie Monroe wrote:
>> That's a good point.
>> 
>> I still recommend having "Uninterpolable" protocol which could be then 
>> applied on any type. Unfortunately, this would require to introduce some 
>> kind of a reflection API on the function type :-/
>> 
>> I'll think about it further today and will try to submit a final version of 
>> the proposal.
>> 
>>> On May 27, 2016, at 8:56 AM, Vladimir.S <sva...@gmail.com> wrote:
>>> 
>>> Just caught another issue with string interpolation:
>>> 
>>> "File \"\(url.lowercased)\" not found."
>>> 
>>> I mistyped the `lowercased` without `()` and got:
>>> File "(Function)" not found.
>>> 
>>> I believe we need a protection for such situations
>>> 
>>> On 24.05.2016 13:01, Charlie Monroe via swift-evolution wrote:
>>>> Hi Nicola, thanks for the feedback.
>>>> 
>>>>> I assume you mean "at runtime" here?
>>>> 
>>>> That's probably my wrong wording. :) The unexpected result is at runtime, 
>>>> but we'd like to catch this at compile time. I've updated it to say
>>>> 
>>>> "in order to prevent unexpected results already at compile time" - 
>>>> hopefully that's a clearer wording.
>>>> 
>>>>> I think the detailed design needs  some more thought. The "Uninterpolable"
>>>>> protocol, and suggesting to cast "as Any" in a Fix-it both seem hacks.
>>>> 
>>>> Originally, the proposal was simply to emit a warning for interpolation of 
>>>> Optionals, but several people made good points:
>>>> 
>>>> - there may be other types you may not want to use for interpolation - as 
>>>> mentioned in the proposal, e.g. private data structures that would expose 
>>>> something you want to keep private, various enum values, etc. Which is why 
>>>> I've started thinking about making a protocol that would indicate the type 
>>>> is discouraged being "interpoled". I've thought about this and decided to 
>>>> make a more robust and customizable solution.
>>>> 
>>>> An alternative to this would be to use annotations or just drop this 
>>>> customizability completely. But I think with Swift and its protocol-driven 
>>>> development, marking the type with this protocol is the most robust way to 
>>>> go.
>>>> 
>>>> - both .description and .debugDescription are mentioned in alternatives 
>>>> for the Fix-It.
>>>> 
>>>> "as Any" seemed, however, the cleanest and most robust solution to me, 
>>>> since then the Uninterpolable protocol can be applied to any type without 
>>>> forcing the type to conform to CustomStringConvertible as well. I agree 
>>>> that it's kind of a hack, though.
>>>> 
>>>>> I'm not even sure if the general direction of a compile time warning is 
>>>>> the
>>>>> right one, and if the problem wouldn't be better solved by simply not 
>>>>> making
>>>>> Optional put "Optional()" around the value in its .description.
>>>> 
>>>> There are many people oposing this and expecting the Optional() wrap 
>>>> around the value, indicating the actual type. Actually, including me - I 
>>>> agree it can be useful for some types of debugging since in what you wrote 
>>>> further, there'd be no difference between description of [1, 2, 3] (i.e. 
>>>> [Int]) and Optional([1, 2, 3]) (i.e. [Int]?).
>>>> 
>>>> There are legitimate usecases where the current behavior is correct, but 
>>>> in most of cases, having an optional in string interpolation will lead 
>>>> either to unnecessary clutter in the log/console or bugs - in which case 
>>>> even "nil" is not correct to be used for the interpolation. Which is the 
>>>> basis for this proposal.
>>>> 
>>>>> print("\(o)")               // "Optional(1)", why??
>>>> 
>>>> String has several overloads for the init(stringInterpolationSegment:) 
>>>> initiailizer. Optional falls into the generic <T> category, which will 
>>>> call String(optional) - which most likely uses debugDescription.
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>> 
>> 
>> 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to