[swift-evolution] Guaranteed closure execution
Gwendal Roué
gwendal.roue at gmail.com
Sat Apr 23 09:11:26 CDT 2016
> Le 23 avr. 2016 à 15:47, michael.peternell at gmx.at a écrit :
>
> why not just write
>
> func f(closure: @once () -> ()) // ?
>
> Because, to be honest, I don't want to have to learn the difference between an "argument qualifier" and a "type attribute".
I'm with you here, but I will certainly not fight a Swift lawyer about the actual syntax :-)
For me the best syntax is the following because it makes the @noescape explicit, so that I know that I don't need to use explicit `self.` inside the closure.
func f(closure: @noescape(once) () -> ())
let x: Int
f { x = myIntProperty } // implicit self
> When I think of it, my experimental synchronized-function would also profit from '@once':
>
> /// same as Objective-C's @synchronized(object) { ... } function.
> func synchronized<T>(lock: AnyObject, @noescape _ closure: () throws -> T) rethrows -> T {
> var result: T;
> objc_sync_enter(lock)
> defer { objc_sync_exit(lock) }
> result = try closure()
> return result;
> }
I'm glad you see the point :-) I really believe that @noescape(once) is on the same boat as SE-0061 "Add Generic Result and Error Handling to autoreleasepool() https://github.com/apple/swift-evolution/blob/master/proposals/0061-autoreleasepool-signature.md
Gwendal
More information about the swift-evolution
mailing list