> On Oct 3, 2016, at 2:12 PM, Harlan Haskins <har...@harlanhaskins.com> wrote:
> 
> If you don't think this needs a proposal

Well, that’s not up to me, so let’s wait until someone else chimes in. :)

Mark

> , then Robert has an implementation almost done. We could submit a PR later 
> today.
> 
> - Harlan
> 
> On Oct 3, 2016, at 4:06 PM, Mark Lacey via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> 
>> 
>>> On Oct 3, 2016, at 11:26 AM, Joe Groff via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>> 
>>>> On Oct 3, 2016, at 11:02 AM, Robert Widmann <devteam.cod...@gmail.com 
>>>> <mailto:devteam.cod...@gmail.com>> wrote:
>>>> 
>>>> Because the initializer here doesn’t take Any, it takes <T>.
>>> 
>>> I think there's a case to be made to generalize the 'Any' warning to 
>>> Optional implicitly being deduced as a type variable binding in any 
>>> unconstrained context. What exactly constitutes 'implicit' and 
>>> 'unconstrained' is up for debate, though, and probably needs some 
>>> experimentation to figure out what feels good. For instance, explicitly 
>>> constructing an optional is a signal the optionality intentional. 
>>> Potentially, having multiple Optional parameters binding the same type 
>>> variable also increases the likelihood it's intended, for example:
>>> 
>>> func foo<T>(x: T, y: T) {}
>>> 
>>> var x: Int? = 1
>>> var y: Int = 2
>>> foo(x, y) // One Optional isn't unwrapped, forcing the other to promote. 
>>> Maybe a mistake?
>>> var z: Int? = 3
>>> foo(x, z) // Two T parameters are Optional. Probably intentional?
>>> 
>>> Regardless of whether there's a more general principle we can base a 
>>> warning on, string interpolation and String(describing:) are common enough 
>>> pitfalls that they may just deserve special case treatment.
>> 
>> I think string interpolation could be handled pretty easily with a warning 
>> by extending the existing warning for Any. We just need to look at 
>> interpolation expressions and if any of the segments are optional-typed emit 
>> a warning unless they are explicitly casted to the optional type. The fixit 
>> can suggest explicit casting or using the debugDescription.
>> 
>> I’m not sure we really need an evolution proposal for that.
>> 
>> As for the more general topic of trickiness around optional injection into 
>> unconstrained generics: Yes, we should review that at some point as well. I 
>> recall seeing at least one concrete complaint about surprising behavior 
>> resulting from doing this in generic functions, but I cannot find the bug at 
>> the moment.
>> 
>> Mark
>> 
>> 
>>> 
>>> -Joe
>>> 
>>>> ~Robert Widmann
>>>> 
>>>>> On Oct 3, 2016, at 2:00 PM, Harlan Haskins via swift-evolution 
>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>> 
>>>>> Unfortunately, Optional-to-Any does not currently hit this case because 
>>>>> IIRC it doesn't promote to Any in an interpolation segment. I tested this 
>>>>> with a ToT build yesterday.
>>>>> 
>>>>> - Harlan
>>>>> 
>>>>> On Oct 3, 2016, at 1:57 PM, Joe Groff <jgr...@apple.com 
>>>>> <mailto:jgr...@apple.com>> wrote:
>>>>> 
>>>>>> We now emit a warning whenever an optional is used as an Any. I disagree 
>>>>>> that this should be an error, but it seems reasonable to warn (if we 
>>>>>> don't already thanks to the 'Any' warning).
>>>>>> 
>>>>>> -Joe
>>>>>> 
>>>>>>> On Oct 3, 2016, at 10:52 AM, Harlan Haskins via swift-evolution 
>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>>> 
>>>>>>> Hey all,
>>>>>>> 
>>>>>>> Julio Carrettoni, Robert Widmann, and I have been working on a proposal 
>>>>>>> to mitigate something that's burned us all since Swift 1. We'd love 
>>>>>>> some feedback!
>>>>>>> 
>>>>>>> It's available here: 
>>>>>>> https://gist.github.com/harlanhaskins/63b7343e7fe4e5f4c6cfbe9413a98fdd 
>>>>>>> <https://gist.github.com/harlanhaskins/63b7343e7fe4e5f4c6cfbe9413a98fdd>
>>>>>>> 
>>>>>>> I've posted the current draft below.
>>>>>>> 
>>>>>>> Thanks,
>>>>>>> Harlan Haskins
>>>>>>> 
>>>>>>> Disallow Optionals in String Interpolation Segments
>>>>>>> 
>>>>>>> Proposal: SE-NNNN 
>>>>>>> <https://gist.github.com/harlanhaskins/NNNN-filename.md>
>>>>>>> Authors: Harlan Haskins <https://github.com/harlanhaskins>, Julio 
>>>>>>> Carrettoni <https://github.com/Julioacarrettoni>, Robert Widmann 
>>>>>>> <https://github.com/CodaFi>
>>>>>>> Review Manager: TBD
>>>>>>> Status: Awaiting revie
>>>>>>>  
>>>>>>> <https://gist.github.com/harlanhaskins/63b7343e7fe4e5f4c6cfbe9413a98fdd#introduction>Introduction
>>>>>>> 
>>>>>>> Swift developers frequently use string interpolation as a convenient, 
>>>>>>> concise syntax for interweaving variable values with strings. The 
>>>>>>> interpolation machinery, however, has surprising behavior in one 
>>>>>>> specific case: Optional<T>. If a user puts an optional value into a 
>>>>>>> string interpolation segment, it will insert either "Optional("value")" 
>>>>>>> or "nil" in the resulting string. Neither of these is particularly 
>>>>>>> desirable, so we propose a warning and fix-it to surface solutions to 
>>>>>>> these potential mistakes.
>>>>>>> 
>>>>>>> Swift-evolution thread: Discussion thread topic for that proposal 
>>>>>>> <https://lists.swift.org/pipermail/swift-evolution/>
>>>>>>>  
>>>>>>> <https://gist.github.com/harlanhaskins/63b7343e7fe4e5f4c6cfbe9413a98fdd#motivation>Motivation
>>>>>>> 
>>>>>>> The Swift Programming Language defines string interpolation segments as 
>>>>>>> "a way to construct a new String value from a mix of constants, 
>>>>>>> variables, literals, and expressions". There is one type that runs 
>>>>>>> counter to this definition: Optional. The .none case in particular is 
>>>>>>> used to indicate the absence of a value. Moreover, its inclusion in 
>>>>>>> interpolation segments leads to the dreaded "nil" in output that is 
>>>>>>> often fed to UI elements. Even barring that, interpolating a non-nil 
>>>>>>> optional value yields "Optional("value")", a result that is not useful 
>>>>>>> even in logged output.
>>>>>>> 
>>>>>>> Given that the Optional type is never fit for display to the end user, 
>>>>>>> and can often be a surprising find in the console, we propose that 
>>>>>>> requesting an Optional's debug description be an explicit act. This 
>>>>>>> proposal now requires a warning when using an expression of Optional 
>>>>>>> type within a string interpolation segment.
>>>>>>> 
>>>>>>>  
>>>>>>> <https://gist.github.com/harlanhaskins/63b7343e7fe4e5f4c6cfbe9413a98fdd#proposed-solution>Proposed
>>>>>>>  solution
>>>>>>> 
>>>>>>> The user will be warned after attempting to use an expression with type 
>>>>>>> Optional<T> in a string interpolation segment. They will then be 
>>>>>>> offered a fixit suggesting they explicitly request the debugDescription 
>>>>>>> of the Optional value instead.
>>>>>>> 
>>>>>>>  
>>>>>>> <https://gist.github.com/harlanhaskins/63b7343e7fe4e5f4c6cfbe9413a98fdd#detailed-design>Detailed
>>>>>>>  design
>>>>>>> 
>>>>>>> Semantic analysis currently does not do much but guarantee the 
>>>>>>> well-formedness of expressions in interpolation segments. These are 
>>>>>>> then fed directly to String.init(stringInterpolationSegment:) and are 
>>>>>>> run through the runtime reflection system to generate a description. 
>>>>>>> Semantic analysis will be tweaked to inspect the result of solving an 
>>>>>>> interpolation segment for an Optional and will offer a fixit in that 
>>>>>>> case.
>>>>>>> 
>>>>>>>  
>>>>>>> <https://gist.github.com/harlanhaskins/63b7343e7fe4e5f4c6cfbe9413a98fdd#impact-on-existing-code>Impact
>>>>>>>  on existing code
>>>>>>> 
>>>>>>> As this is a warning, code written before this proposal will continue 
>>>>>>> to compile and run with the same semantics as before. Authors of code 
>>>>>>> that makes use of this unsafe pattern will be offered a migration path 
>>>>>>> to the safer, more explicit form.
>>>>>>> 
>>>>>>>  
>>>>>>> <https://gist.github.com/harlanhaskins/63b7343e7fe4e5f4c6cfbe9413a98fdd#alternatives-considered>Alternatives
>>>>>>>  considered
>>>>>>> 
>>>>>>> A fixit that suggests a default value be inserted would be entirely 
>>>>>>> appropriate (following the style of the fixit introduced in SE-0140 
>>>>>>> <https://github.com/apple/swift-evolution/blob/master/proposals/0140-bridge-optional-to-nsnull.md>).
>>>>>>> 
>>>>>>> Forbidding this pattern by hard error would make this proposal a 
>>>>>>> breaking change that is out of scope for this stage of Swift's 
>>>>>>> development.
>>>>>>> 
>>>>>>> A fixit that introduces a force-unwrapping would technically work as 
>>>>>>> well, however it would be fixing a dangerous operation with yet another 
>>>>>>> dangerous operation.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> Sent from my iPad
>>>>>>> _______________________________________________
>>>>>>> swift-evolution mailing list
>>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>>> 
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> 
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <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