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

Paul Ossenbruggen possen at gmail.com
Wed Mar 23 08:31:52 CDT 2016


Thanx Maximillian for writing this, saved me from doing it and well put! :-)

- Paul
> On Mar 23, 2016, at 5:46 AM, Maximilian Hünenberger via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Hi Brent,
> 
> First of all, I like your suggestions however there was already a proposal about "Pattern matching partial functions" which could address this and many other issues (See pull request #111; unfortunately the discussion doesn't went on... Hopefully this time).
> 
> This proposal addresses the issue of switch statements which return something in every "case". It uses special closures as unapplied switch statements and uses a global "match" function:
> 
> func match<T, U>(value: T, closure: T -> U) -> U {
>          return closure(value)
> }
> 
> The case you describe could now be rewritten to:
> 
> // no returns
> enum Suit: Int {
>        case Hearts, Spades, Diamonds, Clubs
> 
>        static var all: Suit[] { return [ Hearts, Spades, Diamonds, Clubs ] }
> 
>        var description: String {
>            return match(self) {
>                case .Hearts: "♥️"
>                case .Spades: "♠️"
>                case .Diamonds: "♦️"
>                case .Clubs: "♣️"
>            }
>        }
> 
>        var isRed: Bool {
>            return match(self) {
>                case .Hearts, .Diamonds: true
>                case .Spades, .Clubs: false
>            }
>        }
>    }
> 
> // or even without case (which was highly controversial in the discussions)
> enum Suit: Int {
>        case Hearts, Spades, Diamonds, Clubs
> 
>        static var all: Suit[] { return [ Hearts, Spades, Diamonds, Clubs ] }
> 
>        var description: String {
>            return match(self) {
>                cases .Hearts: "♥️", .Spades: "♠️", .Diamonds: "♦️", .Clubs: "♣️"
>            }
>        }
> 
>        var isRed: Bool {
>            return match(self) {
>                cases .Hearts, .Diamonds: true, .Spades, .Clubs: false
>            }
>        }
>    }
> 
> What do you think about this?
> 
> Kind regards
> - Maximilian
> 
> Am 23.03.2016 um 11:13 schrieb Brent Royal-Gordon via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>>:
> 
>> 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 <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160323/a2113e21/attachment.html>


More information about the swift-evolution mailing list