But in the union type design, String == String | String, this is always true
> I already answered that question: > > For example: > > typealias ABC = A | B | C > > typealias ABCD = ABC | D > > we just use an existed type ABC to construct ABCD > > But how about generic wrap? > > Bikeshedding: > > // we generate the boundary with `A | B` or directly OneOf<A, B> enum > OneOf<...T> { ...case $#(T) // Bikeshedding variadic enum casses: // we might > need an index to set the value? init(index: Int, value: T) { self = > .$index(value) } } /// Usage: /// A | B | C == OneOf<A, B, C> func |<T, U>(_: > T.Type, _: U.Type) -> OneOf<T, U>.Type { // I also use the proposal to remove > `.self` magic here return OneOf<T, U> } // Here is how to merge OneOf into a > single dimension func |<...T, U>(_: OneOf<...T>.Type, _: U.Type) -> > OneOf<...T, U>.Type { // Copy and merge types into the new `OneOf` type > return OneOf<...T, U> } func |<T, ...U>(_: T.Type, _: OneOf<...U>.Type) -> > OneOf<T, ...U>.Type { // Copy and merge types into the new `OneOf` type > return OneOf<T, ...U> } func |<...T, ...U>(_: OneOf<...T>.Type, _: > OneOf<...U>.Type) -> OneOf<...T, ...U>.Type { // Copy and merge types into > the new `OneOf` type return OneOf<...T, ...U> } > Your example will become: > > typealias ABC = A | B | C // or OneOf<A, B, C> typealias ABCD = ABC | D // > merging lhs OneOf with D to OneOf<A, B, C, D> > Mission accomplished. > > Again this is not a true union type because String | String != String > > You’d get a OneOf enum with both first and second case as A. You still can > distinguish them by the indexed label. > > let test = OneOf<A, A>.init(index: 0, value: A()) switch test { case .$1(let > value) // do something case .$2(let value) // do something } Again this is all bikeshedding of variadic generics and variadic enums! > 在 2016年7月1日,21:35,Cao Jiannan <frog...@163.com> 写道: > > what if OneOf<A, A>? > > duplicate variable compile warning? > >> 在 2016年7月1日,20:59,Adrian Z. <notificati...@github.com >> <mailto:notificati...@github.com>> 写道: >> >> Just one simple thing to add: >> >> If ...T equals 10 then <...T, U> = 10 + 1 = 11 types >> If ...U equals 17 then <T, ...U> = 1 + 17 = 18 types >> If ...T equals 20 and ...Uequals 22 then <...T, ...U> = 20 + 22 = 42 types >> — >> You are receiving this because you were mentioned. >> Reply to this email directly, view it on GitHub >> <https://github.com/apple/swift-evolution/pull/404#issuecomment-229940122>, >> or mute the thread >> <https://github.com/notifications/unsubscribe/ABsfmhH9yasaWK8vAs17DGXWHV54QuCkks5qRQ9KgaJpZM4JC7-2>. >> >>> >> >>> 在 2016年7月1日,21:33,Cao Jiannan <frog...@163.com <mailto:frog...@163.com>> 写道: >>> >>> I can't compile your code. I'm really not sure your code will pass the >>> complex generic check 🙃 >>> >>> Union version more complex or generic version? >>> I think union version is more normal. >>>> For example: >>>> >>>> typealias ABC = A | B | C >>>> >>>> typealias ABCD = ABC | D >>>> >>>> we just use an existed type ABC to construct ABCD >>>> >>>> But how about generic wrap? >>>> >>>> Bikeshedding: >>>> >>>> // we generate the boundary with `A | B` or directly OneOf<A, B> >>>> enum OneOf<...T> { >>>> >>>> ...case $#(T) >>>> >>>> // Bikeshedding variadic enum casses: >>>> // we might need an index to set the value? >>>> init(index: Int, value: T) { >>>> >>>> self = .$index(value) >>>> } >>>> } >>>> >>>> /// Usage: >>>> /// A | B | C == OneOf<A, B, C> >>>> func |<T, U>(_: T.Type, _: U.Type) -> OneOf<T, U>.Type { >>>> >>>> // I believe the usage of `type` like this was prposed by Joe Groff >>>> // I also use the proposal to remove `.self` magic here >>>> return OneOf<T, U> >>>> } >>>> >>>> // Here is how to merge OneOf into a single dimension >>>> func |<...T, U>(_: OneOf<...T>.Type, _: U.Type) -> OneOf<...T, U>.Type { >>>> >>>> // Copy and merge types into the new `OneOf` type >>>> return OneOf<...T, U> >>>> } >>>> >>>> func |<T, ...U>(_: T.Type, _: OneOf<...U>.Type) -> OneOf<T, ...U>.Type { >>>> >>>> // Copy and merge types into the new `OneOf` type >>>> return OneOf<T, ...U> >>>> } >>>> >>>> func |<...T, ...U>(_: OneOf<...T>.Type, _: OneOf<...U>.Type) -> >>>> OneOf<...T, ...U>.Type { >>>> >>>> // Copy and merge types into the new `OneOf` type >>>> return OneOf<...T, ...U> >>>> } >>>> Your example will become: >>>> >>>> typealias ABC = A | B | C // or OneOf<A, B, C> >>>> typealias ABCD = ABC | D // merging lhs OneOf with D to OneOf<A, B, C, D> >>>> Mission accomplished. >>>> >>>> >>>>> 在 2016年7月1日,17:06,Cao Jiannan <frog...@163.com <mailto:frog...@163.com>> >>>>> 写道: >>>>> >>>>> https://github.com/frogcjn/swift-evolution/blob/master/proposals/xxxx-union-type.md >>>>> >>>>> <https://github.com/frogcjn/swift-evolution/blob/master/proposals/xxxx-union-type.md> >>>>> >>>>> Hi, >>>>> >>>>> I'm now officially proposal the union type feature for Swift. Please see: >>>>> >>>>> >>>>> https://github.com/apple/swift/commit/eb7311de065df7ea332cdde8782cb44f9f4a5121 >>>>> >>>>> <https://github.com/apple/swift/commit/eb7311de065df7ea332cdde8782cb44f9f4a5121> >>>>> Introduction >>>>> >>>>> Add union type grammar, represents the type which is one of other types. >>>>> >>>>> var stringOrURL: String | URL = "https://www.apple.com >>>>> <https://www.apple.com/>" >>>>> >>>>> >>>>> I would be thankful if someone support this idea and give some advice. >>>>> Thanks! >>>>> >>>>> >>>>> -- >>>>> Jiannan >>>>> >>>>> >>>> >>
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution