> On Apr 26, 2016, at 11:26, Chris Lattner via swift-evolution 
> <[email protected]> wrote:
> 
>> 
>> On Apr 26, 2016, at 12:15 AM, Aleksandar Petrovic via swift-evolution 
>> <[email protected] <mailto:[email protected]>> 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

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to