Hi Matthew,

Finally found time to read the proposal. Much better than the previous 
iterration. I’m not a huge fan of the proposed syntax either but don’t have the 
energy for bike shedding :)

As a side note, I’d like to say that I would not use this very often. I much 
more often use unowned capture variables when its clear that the closure can’t 
outlive the captured variable. For example, my code often looks like this:

class MyViewController : UIViewController {
    var button: ActionButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        button.addAction { [unowned self] in
            print("self: \(self)")
        }
    }
}

> On 20 Feb 2017, at 18:01, Matthew Johnson via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> 
>> On Feb 20, 2017, at 8:33 AM, Florent Bruneau <florent.brun...@intersec.com> 
>> wrote:
>> 
>> 
>> 
>>> Le 20 févr. 2017 à 06:35, Brent Royal-Gordon via swift-evolution 
>>> <swift-evolution@swift.org> a écrit :
>>> 
>>>> On Feb 19, 2017, at 2:57 PM, Matthew Johnson via swift-evolution 
>>>> <swift-evolution@swift.org> wrote:
>>>> 
>>>> A guarded closure may be created by prefixing a bound instance method 
>>>> reference with the `?` sigil:
>>>> 
>>>> ```swift
>>>> let guarded = ?myObject.myMethod
>>>> 
>>>> // desugars to:
>>>> let guarded = { [weak myObject] in
>>>> guard let myObejct = myObject else {
>>>> return
>>>> }
>>>> myObject.myMethod()
>>>> }
>>>> ```
>>> 
>>> I like this in principle, but I don't like the syntax. The `?` is cryptic 
>>> and looks pretty strange in prefix position. I think what I'd like to see 
>>> is:
>>> 
>>>     let guarded = weak myObject.myMethod
>> 
>> I like the idea of weak closures even if this may conflict with the fact 
>> closures are already internally refcounted object. While we cannot have weak 
>> references to closure in the language, using `weak` might be misleading in 
>> some ways.
>> 
>> In term of syntax, the `weak` keyword looks nice (much better than the '?' 
>> and @guarded once). The weak could be used on both sides.
>> 
>> ```swift
>> addAction(action: weak Action)
>> addAction(action: weak myAction)
>> ```
>> 
>> However, I think this might still look weird with inlined closures, in 
>> particular in case you use the suffix syntax for closures:
>> 
>> ```swift
>> addAction() weak {
>>   /* */
>> }
>> ```
> 
> 
> We wouldn’t want to use `weak` if this has the guarded behavior I proposed.  
> We could use `guarded` though.
> 
> There are a couple of important things enabled by having the language 
> implement the guarded behavior.  
> 
> First, the implementation could release the entire closure context as soon as 
> one of the guarded captures is released.  This is not possible if users write 
> the code out manually.  Second, in the future directions I discuss allowing 
> libraries to detect that the guard has been triggered and the closure has 
> become a no-op.  This is also not possible when users write the guard out 
> manually and would be quite desirable for libraries that want to discard 
> their reference to the closure after it becomes a no-op.
> 
> _______________________________________________
> 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