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)
> 下面是被转发的邮件:
>
> 发件人: [email protected]
> 主题: 回复: [swift-evolution] Union instead of Optional
> 日期: 2016年5月15日 GMT+8 18:00:55
> 收件人: Austin Zheng <[email protected]>
>
>
> 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 <[email protected]
> <mailto:[email protected]>> 写道:
>
>> 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
>>>> [email protected] <mailto:[email protected]>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected] <mailto:[email protected]>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution