<span class="pl-k">enum</span> OneOf<span class="pl-k">&lt;...</span>T<span class="pl-k">&gt;</span> {

<span class="pl-k">...</span><span class="pl-k">case</span> \$#(T)

<span class="pl-c">// Bikeshedding variadic enum casses:</span>
<span class="pl-c">// we might need an index to set the value?</span>
<span class="pl-k">init</span>(index: <span class="pl-c1">Int</span>, value: T) {

<span class="pl-k">self</span> <span class="pl-k">=</span> <span class="pl-k">.</span>\$index(value)
}
}

<span class="pl-c">/// Usage:</span>
<span class="pl-c">/// A | B&nbsp;| C == OneOf&lt;A, B, C&gt;</span>
<span class="pl-k">func</span> <span class="pl-en">|</span>&lt;T, U&gt;(_: T<span class="pl-k">.</span><span class="pl-k">Type</span>, _: U<span class="pl-k">.</span><span class="pl-k">Type</span>) <span class="pl-k">-&gt;</span> OneOf&lt;T, U&gt;.Type {

<span class="pl-c">// I believe the usage of `type` like this was prposed by Joe Groff</span>
<span class="pl-c">// I also use the proposal to remove `.self` magic here</span>
<span class="pl-k">return</span> OneOf<span class="pl-k">&lt;</span>T, U<span class="pl-k">&gt;</span>
}

<span class="pl-c">// Here is how to merge OneOf into a single dimension</span>
<span class="pl-k">func</span> <span class="pl-en">|</span>&lt;<span class="pl-k">...</span>T, U&gt;(_: OneOf<span class="pl-k">&lt;...</span>T<span class="pl-k">&gt;.</span><span class="pl-k">Type</span>, _: U<span class="pl-k">.</span><span class="pl-k">Type</span>) <span class="pl-k">-&gt;</span> OneOf&lt;...T, U&gt;.Type {

<span class="pl-c">// Copy and merge types into the new `OneOf` type</span>
<span class="pl-k">return</span> OneOf<span class="pl-k">&lt;...</span>T, U<span class="pl-k">&gt;</span>
}

<span class="pl-k">func</span> <span class="pl-en">|</span>&lt;T, <span class="pl-k">...</span>U&gt;(_: T<span class="pl-k">.</span><span class="pl-k">Type</span>, _: OneOf<span class="pl-k">&lt;...</span>U<span class="pl-k">&gt;.</span><span class="pl-k">Type</span>) <span class="pl-k">-&gt;</span> OneOf&lt;T, ...U&gt;.Type {

<span class="pl-c">// Copy and merge types into the new `OneOf` type</span>
<span class="pl-k">return</span> OneOf<span class="pl-k">&lt;</span>T, <span class="pl-k">...</span>U<span class="pl-k">&gt;</span>
}

<span class="pl-k">func</span> <span class="pl-en">|</span>&lt;<span class="pl-k">...</span>T, <span class="pl-k">...</span>U&gt;(_: OneOf<span class="pl-k">&lt;...</span>T<span class="pl-k">&gt;.</span><span class="pl-k">Type</span>, _: OneOf<span class="pl-k">&lt;...</span>U<span class="pl-k">&gt;.</span><span class="pl-k">Type</span>) <span class="pl-k">-&gt;</span> OneOf&lt;...T, ...U&gt;.Type {

<span class="pl-c">// Copy and merge types into the new `OneOf` type</span>
<span class="pl-k">return</span> OneOf<span class="pl-k">&lt;...</span>T, <span class="pl-k">...</span>U<span class="pl-k">&gt;</span>
}</pre></div><p class="">Your example will become:</p><div class="highlight highlight-source-swift"><pre class=""><span class="pl-k">typealias</span> ABC <span class="pl-k">=</span> A <span class="pl-k">|</span> B <span class="pl-k">|</span> C <span class="pl-c">// or OneOf&lt;A, B, C&gt;</span>
<span class="pl-k">typealias</span> ABCD <span class="pl-k">=</span> ABC <span class="pl-k">|</span> D <span class="pl-c">// merging lhs OneOf with D to OneOf&lt;A, B, C, D&gt;</span></pre></div><p class="">Mission accomplished.</p></div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><div class="">在 2016年7月1日，17:06，Cao Jiannan &lt;<a href="mailto:frogcjn@163.com" class="">frogcjn@163.com</a>&gt; 写道：</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><a href="https://github.com/frogcjn/swift-evolution/blob/master/proposals/xxxx-union-type.md" class="">https://github.com/frogcjn/swift-evolution/blob/master/proposals/xxxx-union-type.md</a><div class=""><br class=""></div><div class=""><div class="">Hi,</div><div class=""><br class=""></div><div class="">I'm now officially proposal the union type feature for Swift. Please see:</div><div class=""><br class=""></div><br class="Apple-interchange-newline"><a href="https://github.com/apple/swift/commit/eb7311de065df7ea332cdde8782cb44f9f4a5121" class="">https://github.com/apple/swift/commit/eb7311de065df7ea332cdde8782cb44f9f4a5121</a></div><div class=""><h2 style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);" class="">Introduction</h2><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class="">Add union type grammar, represents the type which is one of other types.</p><div class="highlight highlight-source-swift" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.600000381469727px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; word-wrap: normal; padding: 16px; overflow: auto; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: normal;" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> stringOrURL: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">String</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">|</span> URL <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span><a href="https://www.apple.com/" class="">https://www.apple.com</a><span class="pl-pds" style="box-sizing: border-box;">"</span></span></pre></div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">I would be thankful if someone support this idea and give some advice. Thanks!</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">--</div></div><div class="">Jiannan</div><div class=""><br class=""></div><div class=""><br class=""></div></div></div></blockquote></div><br class=""></blockquote></div></div></blockquote></div><br class=""></blockquote></body></html>