[swift-evolution] [Pitch] Move @noescape

Chris Lattner clattner at apple.com
Thu Mar 3 16:01:41 CST 2016


Chris Eidhof noticed an emergent result of removing our currying syntax: it broke some useful code using @noescape, because we only allowed it on parameter declarations, not on general things-of-function-type.  This meant that manually curried code like this:

func curriedFlatMap<A, B>(x: [A]) -> (@noescape A -> [B]) -> [B] {
    return { f in
        x.flatMap(f)
    }
}

Was rejected.  Fixing this was straight-forward (https://github.com/apple/swift/commit/c3c6beac72bc0368030f06d52c46b6444fc48dbd), but required @noescape being allowed on arbitrary function types.  Now that we have that, these two declarations are equivalent:

	func f(@noescape fn : () -> ()) {}
	func f(fn : @noescape () -> ()) {}

I propose that we remove the former syntax, migrating code to the later form.  This leads to better consistency between our declarations and types, and follows the precedent of inout.  @autoclosure should also probably move as well.

Thoughts?

-Chris


More information about the swift-evolution mailing list