[swift-evolution] [proposal] Union Type
Cao Jiannan
frogcjn at 163.com
Mon May 16 06:26:52 CDT 2016
Union is far better then generic enum/protocol solution.
* It can extend the original enum and make it powerful.
enum ResultDataType {
case Music
case Video
case File
}
enum FailureType {
case HTTP404
case HTTP502
}
enum FailureTypev2 {
case HTTP451
}
typealias Result = (ResultDataType | FailureType | FailureTypev2)
* It keeps the code clear and does not need developer to announce some unnecessary protocols or enums.
like UnionOf3<T,U,V> or ProtocolForABC
* It is easy to wrap original value into an union type.
let a = A()
let union: (A|B|C) = a // Automatically wrap.
* Compiler might search their common properties, and methods, then mark them as a member of the union type.
print(value.someCommonProperty) // Compiler will know their common properties automatically.
* Compiler know the union type exactly composed with which types, better than only know which protocol.
func input(value: ProtocolForABC) {
if value is A {
} else if value is B {
} else if value is C {
} else {
// There are other cases? Compiler doesn't know
}
}
* Original types and union types can have a rational relationship between each other.
Original type is a sub-type of union types contain it.
var fn0: A->Void = {print(v0)}
var fn1: (A|B)->Void = {print(v0)}
fn0 = fn1 // Original Type and Union Type has a sub-typing relationship, OK
var fn2: (A|B|C)->Void = {print($0)}
fn0 = fn2 // OK
fn1 = fn2 // OK
* It is also easy to compare with value of original type.
union == a // Can be compared, Yes for most cases.
* And the most important part, It can replace Optional<T>.
let string: String?
is same to
let string: (String | None) instead of let string: Optional<String>
I really think the union type is a good supplement for Swift. Make the language rational.
And the It is also really good for Reactive Programming.
- Jiannan
> 下面是被转发的邮件:
>
> 发件人: Haravikk <swift-evolution at haravikk.me>
> 主题: 回复: [swift-evolution] Union instead of Optional
> 日期: 2016年5月16日 GMT+8 18:35:25
> 收件人: Austin Zheng <austinzheng at gmail.com>
> 抄送: Cao Jiannan <frogcjn at 163.com>, Adrian Zubarev via swift-evolution <swift-evolution at swift.org>
>
>
>> On 16 May 2016, at 11:17, Austin Zheng via swift-evolution <swift-evolution at swift.org> wrote:
>>
>> If A, B, and C are not related via protocol or class inheritance, then there is almost nothing you can do with value. Otherwise you still need to test against the concrete type using a case statement or a if-else ladder.
>
> I think that a case statement or similar syntax will still be needed, and the case names would just be the types themselves. This would work best with support for type-narrowing, for example:
>
> func someMethod(value:(A|B|C)) {
> switch (value) {
> case .A:
> value.someMethodForTypeA()
> case .B:
> value.someMethodForTypeB()
> case .C:
> value.someMethodForTypeC()
> }
> }
>
> A union should really just be though of as a lightweight, restricted form of enum that can be declared in a quick ad-hoc fashion, similar to how tuples are a simpler form of struct.
>
> I’m generally a +1 for the feature, but I’d be interested to hear about how well equipped the compiler is for optimising something like this. In most cases an Optional covers what I need, and in more complex cases I’d probably declare overloads for each type (i.e- someMethod(value:A), someMethod(value:B) etc.); unions could make the latter case simpler, but will the compiler produce the same code behind the scenes, i.e- by isolating what’s unique to each type?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160516/6728e085/attachment.html>
More information about the swift-evolution
mailing list