[swift-evolution] [Idea] Find alternatives to `switch self`
Kenny Leung
kenny_leung at pobox.com
Fri Apr 8 13:13:19 CDT 2016
I much prefer the Java style of enums, which are essentially classes limited to a fixed set of instances. In Java, Suit would look like this:
public enum Suit {
Hearts("♥", true),
Spades("♠", false),
Diamonds("♦", true),
Clubs("♣", false);
String description;
boolean isRed;
Suit(String description, boolean isRed) {
this.description = description;
this.isRed = isRed;
}
}
The class java.lang.Enum already provides handy methods like
name(),
ordinal(),
toString(), and its inverse, valueOf()
values() - to get all values
-Kenny
> On Mar 23, 2016, at 3:13 AM, Brent Royal-Gordon via swift-evolution <swift-evolution at swift.org> wrote:
>
> If you've written enums before, you've no doubt noticed the irritating phenomenon of `switch self` being absolutely everywhere. I first discovered this in some of my very first Swift code, code so old we were still using the `T[]` shorthand syntax:
>
> enum Suit: Int {
> case Hearts, Spades, Diamonds, Clubs
>
> static var all: Suit[] { return [ Hearts, Spades, Diamonds, Clubs ] }
>
> var description: String {
> switch(self) {
> case .Hearts:
> return "♥️"
> case .Spades:
> return "♠️"
> case .Diamonds:
> return "♦️"
> case .Clubs:
> return "♣️"
> }
> }
>
> var isRed: Bool {
> switch(self) {
> case .Hearts, .Diamonds:
> return true
> case .Spades, .Clubs:
> return false
> }
> }
> }
>
> It would be nice if we could somehow eliminate that. I have two suggestions:
>
> * Implicitly switch on `self` at the top level of a function or accessor (or at least an enum one with top-level `case` statements).
>
> enum Suit: Int {
> case Hearts, Spades, Diamonds, Clubs
>
> static var all = [ Hearts, Spades, Diamonds, Clubs ]
>
> var description: String {
> case .Hearts:
> return "♥️"
> case .Spades:
> return "♠️"
> case .Diamonds:
> return "♦️"
> case .Clubs:
> return "♣️"
> }
>
> var isRed: Bool {
> case .Hearts, .Diamonds:
> return true
> case .Spades, .Clubs:
> return false
> }
> }
>
> * Allow you to attach member definitions to particular cases. It would be an error if they didn't all define the same members, unless there was a top-level catchall.
>
> enum Suit: Int {
> var isRed: Bool { return false }
>
> case Hearts {
> let description: String { return "♥️" }
> let isRed: Bool { return true }
> }
> case Spades {
> let description: String { return "♠️" }
> }
> case Diamonds {
> let description: String { return "♦️" }
> let isRed: Bool { return true }
> }
> case Clubs {
> let description: String { return "♣️" }
> }
>
> static var all = [ Hearts, Spades, Diamonds, Clubs ]
> }
>
> Any thoughts? This has, to be honest, bothered me since approximately the third day I used the language; I'd love to address it sooner or later.
>
> --
> Brent Royal-Gordon
> Architechies
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
More information about the swift-evolution
mailing list