what if OneOf<A, A>? duplicate variable compile warning? 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! -- Adrian Zubarev Sent with Airmail Am 1. Juli 2016 um 11:08:40, Cao Jiannan via swift-evolution (swift-evolution@swift.org) schrieb: Hi all, I'm now officially proposal the union type feature for Swift. Please see: https://github.com/frogcjn/swift-evolution/blob/master/proposals/xxxx-union-type.md Introduction Add union type grammar, represents the type which is one of other types. var stringOrURL: String | URL = "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
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution