> On Dec 30, 2015, at 10:10 AM, Ollie Wagner via swift-evolution 
> <[email protected]> wrote:
> 
> I'm using the lifetime of a variable to push and pop a context in an 
> animation system that I'm writing. I'm interested in using a pattern like:
> 
> func doAnimations() {
>     AnimationContext(speed: 1.0, bounciness: 1.0)
>     // do some animations using these options
> }
> 
> But today, the value returned by AnimationContext(speed:bounciness:) gets 
> deinitted immediately.
> 
> I've come to desire using such a pattern after living with this for a while:
> 
> AnimationContext(speed: 1.0, bounciness: 1.0) {
>     // do some animations using these options 
> }
> 
> But I don't like it because it contributes heavily to rightward drift (a user 
> of this API might want to change the options multiple times), and gets hard 
> to parse when nested in the many other language constructs that create a 
> scope using brackets.

There's a standard function withExtendedLifetime which you can use for this 
already:

withExtendedLifetime(AnimationContext(...)) {
   // AnimationContext is guaranteed to be alive in this block
}

though that doesn't solve the rightward drift problem. You can alternately 
defer { } an artificial use of the object:

@inline(never) func use(x: Any) { }

let x = AnimationContext(...); defer { use(x) }

As discussed in the "scoped resources" thread, we might also benefit from 
something like ObjC ARC's scoped lifetime attribute.

> So — would it be reasonable to suggest that we have some keyword(s) 
> preceeding an initializer that allows a value to stay alive and/or not warn 
> if it winds up going unused? The current behavior in Swift has obviously been 
> considered, so please feel free to tell me if this is a Very Bad Idea. I'm 
> still learning!

The vast majority of objects only own resources that are only necessary for 
that object's own operation, and most of Swift's target platforms are 
resource-constrained, so it's a valuable optimization to be able to deallocate 
objects ASAP. We think it's a reasonable tradeoff for objects which do require 
fixed scopes to require a bit of additional annotation.

-Joe
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to