You’re asking for GADTs: https://en.wikipedia.org/wiki/Generalized_algebraic_data_type <https://en.wikipedia.org/wiki/Generalized_algebraic_data_type>
This feature is difficult to implement correctly and efficiently and I doubt Swift will ever support it, but you never know… Slava > On Mar 14, 2017, at 12:44 PM, Rex Fenley via swift-evolution > <swift-evolution@swift.org> wrote: > > I've run into a problem recently when using generics with enums where I'm > required to specify the type for a generic that isn't used for the enum case > that's constructed. > > Example: > > protocol Mapping { > associatedtype Destination > } > > enum EvictionPolicy { > case append > case replace > } > > enum Map<T: Mapping, U: Mapping> where U.Destination: Collection { > case object(T) > case collection(U, EvictionPolicy) > } > > class IntMapping: Mapping { > typealias Destination = Int > } > > class IntsMapping: Mapping { > typealias Destination = [Int] > } > > // Must specify types for generics that are not in use > let o = Map<IntMapping, IntsMapping>.object(IntMapping()) > let c = Map<IntMapping, IntsMapping>.collection(IntsMapping(), > EvictionPolicy.append) > > What I'd like to be able to do is the following > > enum Map<T: Mapping> { > case object(T) > case collection(T, EvictionPolicy) where T.Destination: Collection > } > > Could this be added to the language? > > -- > Rex Fenley | IOS DEVELOPER > > > Remind.com <https://www.remind.com/> | BLOG <http://blog.remind.com/> | > FOLLOW US <https://twitter.com/remindhq> | LIKE US > <https://www.facebook.com/remindhq>_______________________________________________ > swift-evolution mailing list > swift-evolution@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution