[swift-evolution] Should Swift apply "statement scope" for ARC
Joe Groff
jgroff at apple.com
Mon Sep 26 16:42:02 CDT 2016
> On Sep 25, 2016, at 3:19 AM, John Holdsworth <mac at johnholdsworth.com> wrote:
>
>
>> On 25 Sep 2016, at 04:07, Michael Gottesman <mgottesman at apple.com <mailto:mgottesman at apple.com>> wrote:
>>
>>> init(imageProducer:ImageProducer) {
>>> withExtendedLifetime(CanvasBase()) {
>>> super.init(javaObject: $0.javaObject)
>>> }
>>> image = createImage(imageProducer)
>>> }
>>>
>>> ..but the compiler was having none of it.
>>
>> What was the error? I am assuming that super.init was not in the same function?
>
> Sorry, I should have included that in the email. The error was:
>
> error: initializer chaining ('super.init') cannot be nested in another expression
>
> Is it possible to build in an exception for withExtendedLifetime?
The block structure of `withExtendedLifetime` is a bit of a lie. It looks a bit goofy, but it's just as good to have an empty `withExtendedLifetime` call after the super.init:
init(imageProducer: ImageProducer) {
let canvasBase = CanvasBase()
super.init(javaObject: CanvasBase())
withExtendedLifetime(canvasBase) {}
image = createImage(imageProducer)
}
If you look at the standard library implementation of `withExtendedLifetime`, you'll see that all it does is `defer` a call to the underlying internal `_fixLifetime` operation:
https://github.com/apple/swift/blob/master/stdlib/public/core/LifetimeManager.swift#L15 <https://github.com/apple/swift/blob/master/stdlib/public/core/LifetimeManager.swift#L15>
It may be a better design to just expose `fixLifetime` directly instead of trying to tie it to a scope.
-Joe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160926/d034b67d/attachment.html>
More information about the swift-evolution
mailing list