Now that I think about this, wouldn't that be a better default behavior? All 
captures are this "required" type which means all closures are typed as 
optional. To override that behavior, you'd have to explicitly declare a weak or 
unowned capture instead and if you did that for all reference captures, the 
closure's type would be non-optional as they are now. Seems like that'd be 
safer. I'll shut up now.

l8r
Sean

Sent from my iPad

> On Sep 28, 2016, at 7:25 PM, Sean Heber <s...@fifthace.com> wrote:
> 
> Pretty sure this is all way out of scope, but something about this made me 
> think about this idea (which maybe isn't unique or is maybe even unworkable), 
> but imagine something like where a new capture type is added such as 
> "required" (for lack of another name right now). And the way this works is 
> similar to unowned, but it makes the entire closure "weak" in such a way that 
> the moment any of the required captures go nil, any references to that 
> closure instance also effectively become nil.
> 
> So modifying the example:
> 
> func viewDidLoad() {
>     self.loginForm.onSubmit = {[required self]
>          let f = self.loginForm
>          self.startLoginRequest(email:f.email.text, pwd:f.pwd.text)
>     }
> }
> 
> So in this case, "required self" means self is effectively "unowned" but any 
> references to this closure would have to be weak optional like: weak var 
> onSubmit: (()->Void)? So that when the view controller gets deallocated, the 
> closure goes with it and references become nil.
> 
> l8r
> Sean
> 
> Sent from my iPad
> 
>> On Sep 28, 2016, at 6:42 PM, Jay Abbott via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>> It could potentially be a breaking change if the default for @escaping 
>> closures were made to be weak-capturing.
>> 
>> Since the weak-capturing pattern is only really desirable for @escaping 
>> closures, and (I think) it would be the usual preference, could @escaping 
>> also imply weak-capturing for all references (not just self)? Then there 
>> would be another syntax for strong-capturing-escaping closures. Non-escaping 
>> closures could a) strongly capture references; or b) existing strong 
>> references stay strong and weak ones stay weak, meaning no ref-counts need 
>> to change at all when passing them.
>> 
>> 
>>> On Thu, 29 Sep 2016 at 00:06 Paul Jack via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>> So previously there were a few threads on the "strong self/weak self
>>> dance" but they didn't seem to get anywhere. For instance:
>>> 
>>> https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160201/008713.html
>>> https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160215/010759.html
>>> https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160208/009972.html
>>> 
>>> ...and possibly others.
>>> 
>>> I'd like to propose something even easier (and more specific) than all
>>> of the above discussions. Specifically, I'd like to introduce a new
>>> automagic closure variable, $self, whose presence in a closure would
>>> cause that closure to weakly capture self in a safe manner.
>>> 
>>> As a concrete example, let's imagine a UIViewController for a login
>>> form. Under this proposal, the following code:
>>> 
>>> func viewDidLoad() {
>>>     self.loginForm.onSubmit = {
>>>          let f = $self.loginForm
>>>          $self.startLoginRequest(email:f.email.text, pwd:f.pwd.text)
>>>     }
>>> }
>>> 
>>> ...would be treated by the compiler as equivalent to:
>>> 
>>> func viewDidLoad() {
>>>     self.loginForm.onSubmit = {
>>>          [weak self] in
>>>          if let selfie = self {
>>>              let f = selfie.loginForm
>>>              selfie.startLoginRequest(email:f.email.text,
>>>              pwd:f.pwd.text)
>>>          }
>>>     }
>>> }
>>> 
>>> Note the "if let" there: If self no longer exists, the closure does not
>>> execute at all, but if self does exist, then it exists for the entirety
>>> of the execution of the closure (ie, self won't vanish as a side-effect
>>> of some statement in the closure.) I think these semantics obey the
>>> principle of least surprise; $self can be treated by the developer as a
>>> strong reference.
>>> 
>>> However, that does mean that $self can only be used in a closure that's
>>> (a) Void or (b) Optional. In the latter case, returning nil when self
>>> doesn't exist seems like reasonable/expected behavior.
>>> 
>>> It would be a compile-time error to use both $self and normal self in
>>> the same closure.
>>> 
>>> I'd like to keep this simple, meaning $self always does the above and
>>> nothing else. So, if you need an unowned self, you still need the
>>> original syntax; if your closure needs a non-Optional return type, you
>>> still need the original syntax; etc.
>>> 
>>> Thoughts?
>>> 
>>> -Paul
>>> _______________________________________________
>>> 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
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to