[swift-evolution] [Pitch] Parse expressions after 'as' and 'is' instead of just types

Joe Groff jgroff at apple.com
Wed May 18 14:55:56 CDT 2016


> On May 18, 2016, at 12:54 PM, Matthew Johnson <matthew at anandabits.com> wrote:
> 
> 
>> On May 16, 2016, at 4:06 PM, Joe Groff via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>> Currently, we parse a type after 'as[?!]' and 'is'. This is mostly what you'd expect, but does lead to problems when an 'as' expression appears as part of a comparison:
>> 
>> 	20 as Int64 < y as Int64 // error, '>' expected to close generic parameter list Int64<y>
>> 
>> Looking to the future, many people have also expressed interest in the ability to do dynamic type checks against metatype values, not only static types, as in:
>> 
>> 	class Base {}
>> 	class DerivedA {}
>> 	class DerivedB {}
>> 
>> 	var x: Base.Type = DerivedA
>> 
>> 	DerivedA() as? x // succeeds
>> 	DerivedB() as? x // fails
> 
> The dynamic check itself makes sense but it isn’t clear what type these expressions should return?  It can’t be `DerivedA?` like it would in the equivalent static expression as the type is not known statically:
> 
> DerivedA() as? DerivedA // succeeds with value Optional<DerivedA>.Some
> DerivedB() as? DerivedA // fails with value Optional<DerivedA>.None

Right, the static type of a cast like this would still have to be the upper bound type of the metatype value. (Unless we introduce some sort of path-dependent types to allow `x.Self` to be a type.)

-Joe


More information about the swift-evolution mailing list