> There is another alternative. Rather than trying to come up with another 
> brand-new keyword, we can re-use one that has an existing and appropriate 
> meaning: required.
> 
> Example:
> 
> protocol ExampleProtocol {
>   required typealias Element
>   typealias MethodSignature = (arg: Element) -> Bool
> 
>   ... etc
> }
> 
> It's a little more verbose at the point of use but the declarations are 
> relatively uncommon and this usage is clearly separate from regular typealias 
> declarations.

I don't think `required` captures the intended meaning *at all*. You're not 
required to declare the type of a "required typealias"—it's often, perhaps even 
usually, inferred. On the other hand, all types conforming to ExampleProtocol 
are "required" in some sense to have an Element, but they're also "required" to 
have a MethodSignature. (In fact, they're required to have exactly the 
MethodSignature specified there, but they can have any Element they want.) It's 
just not a good match.

If you wanted to analogize associated types to some existing feature, it would 
clearly be generics (but this is not done for very good reasons). If you wanted 
to reuse an existing keyword at all costs, I suspect what you should actually 
do is mark the non-associated type with `final` (but this doesn't match 
typealiases in other types, and it doesn't solve the searchability problem with 
using "typealias" for associated types).

The whole reason we got into this mess is because we unwisely reused a keyword 
for something barely related. Let's not do it again.

-- 
Brent Royal-Gordon
Architechies

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

Reply via email to