[swift-evolution] [Proposal] Allow upgrading weak self to strong self by assignment

Andrew Bennett cacoyi at gmail.com
Fri Feb 19 19:40:37 CST 2016


A quick note, I'm not sure if it's a hack but you can probably still do
this:

   guard let `self` = self else { return }

It would be good to support this without backticks, I suppose it would be
very special case though. I wonder if you could reassign self as a
different type...


Andrew Bennett

On Saturday, 20 February 2016, Kurt Werle via swift-evolution <
swift-evolution at swift.org> wrote:

> On Fri, Feb 19, 2016 at 3:12 PM, Shawn Erickson <shawnce at gmail.com
> <javascript:_e(%7B%7D,'cvml','shawnce at gmail.com');>> wrote:
>
>> Kurt curious... the "[unowed self]? in" style... is that part of another
>> proposal? The one I hit on is talking about using "[guard self] in".
>>
>
> Kenny Leung originally suggested instead of [guard self] (or my earlier
> notion of [firm self]) that it be [unowned/weak self]? - which more closely
> resembles the intent of object?.method() in that it does exactly the same
> kind of thing - whereas [guard self] implies guard, which implies an else
> statement and more complexity.
>
> The drawback - as you have pointed out - is what to do with multiple
> parameters
> [unowned self, some, others]?
> What does that do?  My (Kenny's) notion is that it implicitly does
> if let self = self, some = some, others = others {
>   ...
> }
>
> What if you want some tricky combination of strong/weak references in that
> block that you want to handle, where some may be nil and others not?  Yeah,
> this would not work for that.  But I can count the number of times where I
> wanted complex references in a [parameter block] where I did not have to
> handle them with various guards/if let's using no hands.  Which is to say,
> this proposal is specifically for the very common boiler plate where you
> want everything not to be nil, you don't want to explicitly unwrap it with
> boiler plate code, and you want nothing to happen if something is nil.
>
> While I like the look of [unowned self]? better than [guard self], I'd be
> happy enough with either.
>
> Kurt
>
>
> On Fri, Feb 19, 2016 at 3:08 PM Shawn Erickson <shawnce at gmail.com
>> <javascript:_e(%7B%7D,'cvml','shawnce at gmail.com');>> wrote:
>>
>>> I am talking about when capturing weak. The unowned capture situation is
>>> the simpler variant of weak, one that doesn't happen to exhibit the
>>> gyration of strongifying a weak capture.
>>>
>>> In the weak situation you most often want to promote the captured weak
>>> reference to a strong reference for some scope of code. You have to do this
>>> currently by assigning the one or more captured weak references you have to
>>> a differently named strong reference.
>>>
>>> Additionally it isn't clear to me how a block with multiple captures
>>> would play in what you are proposing.
>>>
>>> If the strongify situation could be improved by allowing a captured weak
>>> reference to be made strong while avoiding the renaming gyration then I
>>> could see that being coupled with the "[weak/unowned foo]? in" no-op case
>>> (assuming folks see enough reason for the no-op case).
>>>
>>> -Shawn
>>>
>>> On Fri, Feb 19, 2016 at 2:47 PM Kurt Werle <kurt at circlew.org
>>> <javascript:_e(%7B%7D,'cvml','kurt at circlew.org');>> wrote:
>>>
>>>> And to follow up on my own email, isn't that exactly the flow you want?
>>>>
>>>> First you do
>>>> { [unowned self]? in
>>>>   ...
>>>> }
>>>>
>>>> Then you realize that you need to deal with the else case.  You nuke
>>>> the ? and add a guard.
>>>> { [unowned self] in
>>>>   guard if unowned self != nil self {
>>>>     ...
>>>>
>>>> I mean -- I look at that and it seems clear and easy.  You have the ?
>>>> to deal with the nil case.  You remove it and add the block to deal with
>>>> the special nil case.  The intention of both seems clear.  You added the
>>>> guard code when you needed it.
>>>>
>>>> Sign me up!
>>>> Kurt
>>>>
>>>> On Fri, Feb 19, 2016 at 2:39 PM, Kurt Werle <kurt at circlew.org
>>>> <javascript:_e(%7B%7D,'cvml','kurt at circlew.org');>> wrote:
>>>>
>>>>>
>>>>>
>>>>> On Fri, Feb 19, 2016 at 2:30 PM, Shawn Erickson <shawnce at gmail.com
>>>>> <javascript:_e(%7B%7D,'cvml','shawnce at gmail.com');>> wrote:
>>>>>
>>>>>> I get that :) but I think it would be helpful to go beyond the no-op
>>>>>> case and help solve the "strongify" situation that exists in the larger
>>>>>> problem domain.
>>>>>>
>>>>>>>
>>>>> OK - so what's wrong with:
>>>>>
>>>>>
>>>>>> { [unowned self] in
>>>>>>>   guard self != nil else {
>>>>>>>     Do the other thing
>>>>>>>   }
>>>>>>> }
>>>>>>>
>>>>>>
>>>>> It's basically what you're asking for - an unowned implicitly
>>>>> unwrapped variable followed by an else statement that takes care of the nil
>>>>> case.  Right?
>>>>>
>>>>> Kurt
>>>>> --
>>>>> kurt at CircleW.org
>>>>> http://www.CircleW.org/kurt/
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> kurt at CircleW.org
>>>> http://www.CircleW.org/kurt/
>>>>
>>>
>
>
> --
> kurt at CircleW.org
> http://www.CircleW.org/kurt/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160220/6e9e425d/attachment.html>


More information about the swift-evolution mailing list