[swift-evolution] Proposal: Closures capture weak by default
Gwendal Roué
gwendal.roue at gmail.com
Tue Dec 8 11:33:57 CST 2015
Oh, and the concerned reader will have noticed another use of a non-mandatory self in the last sample code:
// Obviously only `foo` is captured, and not self:
let foo = self.foo
performClosure { foo }
Gwendal Roué
> Le 8 déc. 2015 à 18:28, Gwendal Roué <gwendal.roue at gmail.com> a écrit :
>
> I’m really not found at all of having `let` properties captured by closures when used without explicit `self`.
>
> Three reasons:
>
> REASON 1. When `self` is not mandatory, then adding self should have no impact whatsoever.
>
> Why should one add a self that is not mandatory?
>
> 1. for symmetry (1):
>
> self.foo = other.foo
> let delta = self.x - other.x
>
> 2. for symmetry (2):
>
> init(a:String, index:Int) {
> self.name = name
> self.position = index+1 // keep 1-based value for implementation reasons
> }
>
> 3. add your own reasons to use an explicit self even when not required, and I’m sure you did.
>
> So generally speaking, using self when not mandatory should have no impact on the program at all.
>
>
> REASON 2. What happens when a property starts its life as `let`, but turns `var` eventually? For example, the property eventually becomes lazy. OK now it’s is illegal to use the property without explicit `self` in closures, and you break a bunch of code. And you need to bump the major version of your package. Just because you turn a `let foo: String` into `lazy var foo: String = …`.
>
> That’s not good at all.
>
>
> REASON 3. It’s simply not clear. Clever, terse, smart, brilliant, but not clear.
>
> Compare to:
>
> // Obviously only `foo` is captured, and not self:
> let foo = self.foo
> performClosure { foo }
>
> My two cents.
> Gwendal Roué
>
>
>> Le 8 déc. 2015 à 18:01, Paul Cantrell via swift-evolution <swift-evolution at swift.org> a écrit :
>>
>>> For 'let' properties of classes, it'd be reasonable to propose having closures capture the *property* directly by default in this way instead of capturing ‘self'
>>
>> That would be fantastic.
>>
>> I’ve also wondered whether there’s a tidy way for a closure to be tied to the lifecycle of self, so that when self goes away, the closure goes away too. That’s often the desired behavior. On a casual thinking through, though, it seems like a can of worms — and the “guard let self = self else { return }” proposal on another thread gives most of the same benefit.
>>
>> P
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
More information about the swift-evolution
mailing list