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-evolut...@haravikk.me>
> 主题: 回复: [swift-evolution] Union instead of Optional
> 日期: 2016年5月16日 GMT+8 18:35:25
> 收件人: Austin Zheng <austinzh...@gmail.com>
> 抄送: Cao Jiannan <frog...@163.com>, Adrian Zubarev via swift-evolution 
> <swift-evolution@swift.org>
> 
> 
>> On 16 May 2016, at 11:17, Austin Zheng via swift-evolution 
>> <swift-evolution@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?

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to