> On Oct 10, 2016, at 11:08 AM, Joe Groff <[email protected]> wrote:
> 
> 
>> On Oct 9, 2016, at 1:10 PM, Erica Sadun via swift-evolution 
>> <[email protected] <mailto:[email protected]>> wrote:
>> 
>> Normally in guard and if condition lists, you look up a value in a 
>> dictionary and conditionally cast:
>> 
>>     if let value = dict[key] as? T, ...
>> 
>> The "as?" operator passes the Any? type through, and the lhs result is T, 
>> not T?.
>> 
>> * dict[key] returns Any?
>> * Any? as T returns T?, not T??
>> * the conditional binding binds T? to T
>> * PROFIT!
>> 
>> However, this (somewhat illogical) "sugar" doesn't happen when you 
>> conditionally cast T? to U, for example, when a dictionary is [AnyHashable: 
>> String]:
>> 
>> guard let value = dict["Key"] as? NSString
>>     else { fatalError() }
>> 
>> (see http://i.imgur.com/SkXkk6o.jpg <http://i.imgur.com/SkXkk6o.jpg>)
>> 
>> * dict[key] returns String?
>> * String? as T is guaranteed to fail
>> 
>> In this case, the compiler asserts that a cast from String? to an unrelated 
>> type NSString always fails. You can mitigate this by sticking an "Any" cast 
>> in the middle:
>> 
>> guard let value = dict["Key"] as Any as? NSString
>>     else { fatalError() }
>> 
>> If that's not "magic", I don't know what is.  (You can also cast the 
>> dictionary to [AnyHashable: NSString], etc.)
> 
> This is a bug. 'String as NSString' works, and you can cast through Optionals 
> 'T? as? U', so transitively this also works, despite the misleading warning. 
> Please file a bug report if you haven't yet.
> 
> -Joe
> 

https://bugs.swift.org/browse/SR-2911 <https://bugs.swift.org/browse/SR-2911>

(changed lists to reply on Swift-Users)

-- E

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

Reply via email to