> On Jan 29, 2017, at 8:35 PM, Slava Pestov via swift-evolution > <swift-evolution@swift.org> wrote: > >> >> On Jan 29, 2017, at 1:03 PM, Matt Whiteside via swift-evolution >> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: >> >> In Swift 3.1, I was happy to see that we can now extend types with concrete >> constraints. I think one other feature which fits nicely with this new >> capability would be extending typealiases, like this: >> >> typealias Vector = Array<Float> >> >> extension Vector { >> ... >> } >> >> Which currently doesn't compile due to: "Constrained extension must be >> declared on the unspecialized generic type 'Array' with constraints >> specified by a 'where’ clause” >> >> What is other people’s interest level? How possible would it be to add this? > > I think this particular case would be pretty easy to add, but there is a more > general case with generic typealiases that requires some thought: > > typealias OptionalArray<T> = Optional<Array<T>> > > extension OptionalArray { > … > } > > Without generic typealiases, you might imagine this could be written as > something like > > extension <T> Optional<Array<T>> { > … > } > > I think this is called out in the generics manifesto as a potential future > feature. I’m not sure how much work it would take to add it but I imagine > it’s not entirely trivial.
The implementation here would probably not be trivial. There are two general issues, the first of which also applies to extending typealiases: 1) The type checker doesn’t have a principled way of resolving the name of the extended type, so to correctly look through typealiases would require a bunch of reworking of the way we do lookup there. This would be a fantastic improvement to the compiler and would fix a bunch of bugs with extending nested types, too :) 2) There are undoubtedly a number of places in the compiler where we assume that the generic parameters of an extension are the same as the generic parameters of the nominal type, but this will no longer be true if we allow extension of generic typealiases. For example: struct Pair<T, U> { } typealias Array2<V> = Pair<V, V> extension Array2 { // extension has one generic parameter, but Pair has two generic parameters } It’s likely not *hard* to fix these issues, but it’ll be a game of whack-a-mole throughout the compiler. - Doug
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution