[swift-evolution] Shorthand unwrap proposal
L. Mihalkovic
laurent.mihalkovic at gmail.com
Fri Jun 24 08:38:47 CDT 2016
Regards
LM
(From mobile)
> On Jun 24, 2016, at 2:50 PM, Charlie Monroe via swift-evolution <swift-evolution at swift.org> wrote:
>
> Yes, this is a bit different. There was a discussion about a month ago (http://thread.gmane.org/gmane.comp.lang.swift.evolution/17142) which had a few good ideas how to deal with the following pattern:
>
> if let x = x { // do something with x }
> guard let x = x { return }
>
For my own education i built
if let! x {
// x is shadowed
}
> which is shadowing the original optional value. The suggestion was:
>
> if let x! { // within this block, x is no longer optional }
>
> guard let x! { return }
> // Now x is no longer an optional.
>
> Generally, it re-used the same variable name to safe-unwrap the optional. In your particular example:
>
> let i: Int? = nil
> if let i! {
> let y = i.toIntMax()
> /// ...
> }
>
> I am aware of the .map (or flatMap) on the optional, however, the guard statement in particular seems like an improvement.
>
> There are many language constructs in Swift that can be expressed using other constructs - you can go all the way down and say that you really don't need anything other than if and goto.
>
> The question is whether such a syntax sugar is something that would be help one write safer code and if it's something people would use.
>
>
>> On Jun 23, 2016, at 9:32 PM, David Sweeris <davesweeris at mac.com> wrote:
>>
>> Dmitri pointed out a few posts ago that Swift already has this.
>> let opInt: Int? = nil
>> opInt.map {$0.toIntMax()} //Evaluates to nil
>>
>> Are you talking about something different?
>>
>> - Dave Sweeris
>>
>>> On Jun 23, 2016, at 2:04 PM, Charlie Monroe via swift-evolution <swift-evolution at swift.org> wrote:
>>>
>>> Sure, the exact syntax is a matter of discussion, I just wasn't that much of favor of the very short
>>>
>>> doSomething(with: myOptional?)
>>>
>>> - it looks like a great idea, making the code really short
>>> - on the other hand the question mark is next to the variable, but the method's execution is optional - in that sense something like doSomething(?: myOptional)(with: myOptional) makes more sense, declaring explicitely what optionals does the execution depend on.
>>> - nevertheless, in the interest of clarity and readability of the code, I'm still in favor of the original proposal, which requires you to either use if or guard.
>>>
>>>> On Jun 23, 2016, at 8:57 PM, Tim Vermeulen <tvermeulen at me.com> wrote:
>>>>
>>>> But ! still suggests force unwrapping, while ? suggests safe unwrapping. Why not use a question mark?
>>>>
>>>>> It was in the previous proposal and suggested that you are not trying to shadow the previous variable, but trying to unwrap it - and it acts as unwrapped from there on.
>>>>>
>>>>>
>>>>>> On Jun 23, 2016, at 8:52 PM, Tim Vermeulen<tvermeulen at me.com>wrote:
>>>>>>
>>>>>> Why with the exclamation mark? It suggests you’re force unwrapping something.
>>>>>>
>>>>>>>> On Jun 23, 2016, at 8:45 PM, Tim Vermeulen via swift-evolution<swift-evolution at swift.org>wrote:
>>>>>>>>
>>>>>>>> I would love to be able to do something like
>>>>>>>>
>>>>>>>> doSomething(with: myOptional?)
>>>>>>> This actually looks good to me, though if I were a newcomer to the language, it would be really cryptic.
>>>>>>>
>>>>>>> In case the function returned any value, it could become an optional, just like with try?...
>>>>>>>
>>>>>>> I still, however, prefer the original proposal of if let myOptional! { doSomething(myOptional) }...
>>>>>>>
>>>>>>>>
>>>>>>>> which would be equivalent to
>>>>>>>>
>>>>>>>> if let myValue = myOptional {
>>>>>>>> doSomething(with: myValue)
>>>>>>>> }
>>>>>>>>
>>>>>>>> But it’s been discussed here before, and I don’t think people were very enthusiastic about it.
>>>>>>>>
>>>>>>>>> I was wondering if people would be open to adding an unwrap method to the Optional type,I already have a method like this which shortens code for me.
>>>>>>>>>
>>>>>>>>> So this:
>>>>>>>>>
>>>>>>>>> let myReallyLongOptionalName: String? = "Hey"
>>>>>>>>>
>>>>>>>>> if let string = myReallyLongOptionalName {
>>>>>>>>> doSomethingWith(string)
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> Could become"
>>>>>>>>>
>>>>>>>>> let myReallyLongOptionalName: String? = "Hey"
>>>>>>>>>
>>>>>>>>> myReallyLongOptionalName.unwrap {
>>>>>>>>> doSomethingWith($0)
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> The block would only be fired if myReallyLongOptionalName has a value.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ___________________________________
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> James⎥Head of Trolls
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> james at supmenow.com(mailto:james at supmenow.com)⎥supmenow.com(http://supmenow.com)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Sup
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Runway East
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> 10 Finsbury Square
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> London
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> EC2A 1AF
>>>>>>>> _______________________________________________
>>>>>>>> swift-evolution mailing list
>>>>>>>> swift-evolution at swift.org
>>>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160624/324c0cc4/attachment.html>
More information about the swift-evolution
mailing list