[swift-evolution] Guaranteed closure execution

Jacob Bandes-Storch jtbandes at gmail.com
Fri Jan 29 02:23:49 CST 2016


I've wanted something like this as well. I think it would be harder than it
seems, because "x = 1" might need to perform initialization, or assignment,
depending how it's used.

It could make sense to have something like
"@noescape(executed_exactly_once)" but this might be so limited it's not
worth it. And I'm not sure how it should interact with throws.

Jacob

On Thu, Jan 28, 2016 at 11:38 PM, Gwendal Roué <swift-evolution at swift.org>
wrote:

> Hello,
>
> I’d like to discuss the opportunity to let functions declare that a
> closure argument is guaranteed to have been executed when the function has
> returned.
>
> For example:
>
> func f(@noescape(executed) closure: () -> ()) {
>     closure()
> }
>
> The expected advantage is that the compiler would know that a variable set
> inside the closure is guaranteed to be initialized, and that it can be used
> after the execution of the function, as below:
>
> let x: Int  // Not initialized
> f { x = 1 }
> print(x)    // Guaranteed to be initialized
>
> Today developers have to write pessimistic code like below:
>
> var x: Int = 0 // `var` declaration, with some irrelevant value
> f { x = 1 }
> print(x)
>
> As for a real world usage, I’d like to access a database in a safe
> (queued) way, and fetch values out of it:
>
> let items: [Item]
> let users: [User]
> dbQueue.inDatabase { db in
>     items = Item.all().fetchAll(db)
>     users = Item.all().fetchAll(db)
> }
>
> Gwendal Roué
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160129/db3217f2/attachment.html>


More information about the swift-evolution mailing list