[swift-evolution] [Idea] Find alternatives to `switch self`

Brent Royal-Gordon brent at architechies.com
Wed Mar 23 05:13:13 CDT 2016


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



More information about the swift-evolution mailing list