for example, there is a method input union of 3 types: A, B, C,

This is the three class.

class A {}

class B {}

class C {}

This is how it implemented under Swift 2:

enum UnionABC {
    case classA(A)
    case classB(B)
    case classC(C)
}

func input(value: UnionABC) {
    
}

let a = A()
let b = B()
let c = C()
input(UnionABC.classA(a))


It needs announce all the cases and name each cases and cannot use class names 
as their case names.

what about using union? It is more easy and rational.


func input(value: (A | B | C)) {
    
}

let a= A()
input(a)

Or you can implement it with protocol and extension, but compiler will not know 
how many cases it should have.


protocol UnionABC {
    
}

extension A: UnionABC {}
extension B: UnionABC {}
extension C: UnionABC {}


func input(value: UnionABC) {
    if value is A {
        
    } else if value is B {
        
    } else if value is C {
        
    } else {
        // There are other cases? Compiler doesn't know
    }
}

let a = A()
input(a)



> 下面是被转发的邮件:
> 
> 发件人: frog...@163.com
> 主题: 回复: [swift-evolution] Union instead of Optional
> 日期: 2016年5月15日 GMT+8 18:00:55
> 收件人: Austin Zheng <austinzh...@gmail.com>
> 
> 
> Enum and Union are two things.
> 
> If you use Enum to implement Union, you should announce it with case name.
> 
> Another issue using enum instead of union is that,  union can combine types 
> as many as possible, you just write ( A | B | C ... | Z), but for enum, you 
> should carefully announce it for each case. 
> 
> 在 2016年5月15日,15:22,Austin Zheng <austinzh...@gmail.com 
> <mailto:austinzh...@gmail.com>> 写道:
> 
>> In addition, not everything in Swift can be modeled in terms of inheritance 
>> relationships.
>> 
>> I'm a little curious as to why union types keep on coming up, when enums can 
>> do everything they can and much more (methods, constraints on generic types, 
>> conformance to protocols).
>> 
>> Austin
>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>

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

Reply via email to