[swift-evolution] Guaranteed closure execution

Matthew Johnson matthew at anandabits.com
Mon Feb 1 08:31:53 CST 2016

>> func foo() {
>> 	let bar: Int
>> 	withNoEscape { bar = 1 }
>> }
>> func withNoEscape(@autoclosure(once) closure: () -> ()) { /* snip */ }
> Looking back, I do think that there should be a way to exit from `withNoEscape` without calling the closure, so yes, throwing should imply that the closure wasn't executed. If it's possible that `foo` swallowed an error from a throwing `withNoEscape`, the compiler should assume that the variables within haven't been initialized:

I’m glad to see an @autoclosure func in this thread.  We will want to be able to use this feature with @autoclosure in addition to @noescape.

As far as exiting without calling the closure, I suggest `@noescape(once?)`.  The `?` indicates the closure may or may not be called, but will not be called more than once.

This would be handy in the case of the short-circuiting boolean operators, for example:

@warn_unused_result func &&<T : BooleanType, U : BooleanType>(_ lhs: T, @autoclosure(once?) _ rhs: () throws -> U) rethrows -> Bool

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160201/e404ccd4/attachment.html>

More information about the swift-evolution mailing list