[swift-evolution] @noescape and nil

Jordan Rose jordan_rose at apple.com
Wed Apr 27 11:15:06 CDT 2016


> On Apr 26, 2016, at 11:26, Chris Lattner via swift-evolution <swift-evolution at swift.org> wrote:
> 
>> 
>> On Apr 26, 2016, at 12:15 AM, Aleksandar Petrovic via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> 
>> Hi Swift community, I have a question.
>> 
>> This is a valid Swift code:
>> 
>> func testFunc(times: Int, fn: ((Int)->Void)? = nil) {
>> 	guard let f = fn else { return }
>> 	for i in 1 ..< times {
>> 		f(i)
>> 	}
>> }
>> 
>> And this is not:
>> 
>> func testFunc(times: Int, @noescape fn: ((Int)->Void)? = nil) {
>> 	guard let f = fn else { return }
>> 	for i in 1 ..< times {
>> 		f(i)
>> 	}
>> }
>> 
>> I can't think of any hard reason why the @noescape parameter of the function can't be nullable (and, with default value, be optional), but maybe I'm missing something. Is there any plan to correct this in 3.0?
> 
> There are two ways to fix this: a horrible hack that special cases optionals, or the more principled solution that treats optional as the underlying enum type that it is, and making @noescape propagate through to the members of the .some case.
> 
> You can probably guess this, but I’d prefer to discuss fixing the full generality of the problem, not providing a special case in the compiler for this.

Making @noescape work for an arbitrary type doesn’t make sense because we don’t know what that type uses its generic parameter for. The reason we can do it for Optional is because Optional is essentially just a wrapper around T, and the only reason it’s interesting is because we allow an implicit conversion from a closure literal to an optional function type. Anything else would require the closure to explicitly be passed to an initializer or other function to make the types line up, which would clearly not be considered noescape.

We could consider extending this to all enums, but clearly not all structs. I think it’s perfectly reasonable to do this just for Optional.

Jordan

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


More information about the swift-evolution mailing list