[swift-evolution] [Pitch] Hashable types on RawRepresentable enums or a protocol for custom enum-like types
Rien
Rien at Balancingrock.nl
Tue Oct 4 01:24:43 CDT 2016
+1.
I have several cases where I cannot use enums, this proposal would solve that.
> On 03 Oct 2016, at 21:53, Adrian Zubarev via swift-evolution <swift-evolution at swift.org> wrote:
>
> I made a typo in my previous post.
>
> Bikeshdding with correct types:
>
> struct A : Hashable { /* implement everything */ }
>
> // Variant 1:
> enum Test : A {
> case something = A(value: "something")
> case nothing = A(value: "nothing")
> }
>
> // Variant 2:
>
> protocol SomeFancyName : RawRepresentable { … }
>
> struct Test : SomeFancyName {
>
> let rawValue: A
> init?(rawValue: A) {
> // Implement + reject unwanted `A`s
> }
>
> static let something = Test(rawValue: A(value: "something"))
> static let nothing = Test(rawValue: A(value: "nothing"))
> }
>
> let value = Test.something
>
> switch value {
>
> case .something:
> // handle
>
> case .nothing:
> // handle
>
> // Because of `SomeFancyName` the switch can use enum-like pattern matching + does not need the `default` case when all cases are present
> }
>
>
>
>
> --
> Adrian Zubarev
> Sent with Airmail
>
> Am 3. Oktober 2016 um 21:50:07, Adrian Zubarev (adrian.zubarev at devandartist.com) schrieb:
>
>> Hi there,
>>
>> I’m interested if this idea has some potential future in Swift or not.
>>
>> Currently RawRepresentable enums accept only a subset of literal types like String, Character and the Integer family (enum Name : String { … }).
>>
>> Sometimes this is not enough for my use-case and I wish I could feed my enums with other Hashable types!
>>
>> As a workaround I can create a custom struct or even a class and conform it to RawRepresentable and fake an enum with some static variables (similar to what is done with OptionSet types).
>>
>> The problem there is that I cannot use the same switch pattern matching like with enums. I’d wish either enums could accept Hashable types (maybe with some restriction) or the existence on a protocol to build custom enum-like types with strucs/classes and use the same switch pattern matching.
>>
>> struct A : Hashable { /* implement everything */ }
>>
>> // Variant 1:
>> enum Test : A {
>> case something = A(rawValue: A(value: "something"))
>> case nothing = A(rawValue: A(value: "nothing"))
>> }
>>
>> // Variant 2:
>>
>> protocol SomeFancyName : RawRepresentable { … }
>>
>> struct Test : SomeFancyName {
>>
>> let rawValue: A
>> init?(rawValue: A) {
>> // Implement + reject unwanted `A`s
>> }
>>
>> static let something = A(rawValue: A(value: "something"))
>> static let nothing = A(rawValue: A(value: "nothing"))
>> }
>>
>> let value = Test.something
>>
>> switch value {
>>
>> case .something:
>> // handle
>>
>> case .nothing:
>> // handle
>>
>> // Because of `SomeFancyName` the switch can use enum-like pattern matching + does not need the `default` case when all cases are present
>> }
>>
>>
>>
>> --
>> Adrian Zubarev
>> Sent with Airmail
>
> _______________________________________________
> 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