> Le 23 avr. 2016 à 18:33, Timothy Wood <[email protected]> a écrit :
> 
> 
> 
>> On Apr 23, 2016, at 5:56 AM, Gwendal Roué via swift-evolution 
>> <[email protected]>
> [...]
>> 
>> Since @once actually implies @noescape (as described earlier in the thread), 
>> it can be shortened to:
> [...]
> 
> I'm surprised that @once would imply @noescape.

I should try to rewrite my last answer, which did not explain why @once implies 
@noescape.

It is because @once is not a documenting token that is ignored by the compiler. 
Its goal is to be actually *used* by the compiler - and let the following 
snippet compile:

        func f(closure: @noescape(once) () -> ()) { closure() }
        
        let x: Int
        f { x = 1 }
        // use x without compiler complaining that x may be uninitialized.

For this pattern to work, the compiler needs to be able to prove that the 
closure has been called once at the end of the f function execution.

If the @once would only mean "will eventually be called once", the compiler 
would have the biggest difficulties proving it (one can not prove for example 
that NSOperation's completionBlock is called. It is a documentation given, not 
a provable fact), and the compiler would not accept the use of a variable 
initialized in a `once` closure, as in the above sample code.

That's why this proposal focuses on a `once` modifier that implies @noescape, 
AND allows the use of variables initialized in such a closure.

I said in an earlier post that this was a natural extension of  SE-0061 "Add 
Generic Result and Error Handling to autoreleasepool() 
https://github.com/apple/swift-evolution/blob/master/proposals/0061-autoreleasepool-signature.md

Before SE-0061, we had to write:

        var x: Int = 0
        autoreleasepol {
                x = 1
        }
        // use x

With SE-0061, we can write:

        let x = autoreleasepol {
                return 1
        }
        // use x

With this proposal, we can write:

        let x: Int
        let y: String
        autoreleasepol {
                x = 1
                y = "foo"
        }
        // use x and y

Gwendal Roué

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

Reply via email to