I can understand this proposal nite and I don't really think they're related to 
enums at all. You can today achieve the very same behaviour using an empty 
protocol.

protocol P { }

class A : P { }
class B : P { }
struct C : P { }

func test(value : P) { }

IMO, the proposed syntax will only create a shortcut for this. And we'd still 
need to test type and cast the to get anything useful. My question now is: is 
this such a common practice that justifies the shortcut?

-----Original Message-----
From: "Haravikk via swift-evolution" <swift-evolution@swift.org>
Sent: ‎16/‎05/‎2016 07:35 AM
To: "Austin Zheng" <austinzh...@gmail.com>
Cc: "Adrian Zubarev via swift-evolution" <swift-evolution@swift.org>; "Cao 
Jiannan" <frog...@163.com>
Subject: Re: [swift-evolution] Union instead of Optional


> 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
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to