Zef, do you really think `rawValues` are worth adding?

With `cases`, they would be one `map` away, no?

R+

> On 23 Dec 2015, at 17:21, Zef Houssney via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> To be clear, I think there should be a distinction between what would be 
> returned by `cases` and `rawValues`, and I think there is good reason to 
> include both:
> 
> - `cases` would return actual instances of the enum type, or the constructor 
> if there is an associated value for the case and an instance can’t be 
> automatically created
> - `rawValues` would also exist for enums that have a RawRepresentable value.
> 
> The collision of using “case" in something like `for case in SomeEnum.cases` 
> is unfortunate, but I think it’s still the most clear and accurate 
> representation of something that does what I described above. Initially I was 
> thinking there was an existing proposal that would fix this, but now I 
> realize that it’s only scoped to keyword arguments: 
> https://github.com/apple/swift-evolution/blob/master/proposals/0001-keywords-as-argument-labels.md
>  
> <https://github.com/apple/swift-evolution/blob/master/proposals/0001-keywords-as-argument-labels.md>
> 
> 
> Joe, thank you for your thoughts on this! Yes I agree that it doesn’t make 
> sense to try to generate a list of all possible values for all associated 
> types — and that’s pretty much my point. Deciding to omit such unsupported 
> cases is one way to deal with that issue, but it seems confusing and limiting 
> to me that some enum cases would not be represented in the array of values, 
> while others are represented multiple times. I’m not saying that there’s no 
> value to something like that and I’m certainly not opposed to the inclusion 
> of that kind of thing, but I’m interested in finding a way to deal with this 
> in a manner that is more understandable, predictable, and flexible.
> 
> I’d love to hear what you think about returning an array that includes 
> constructors for the cases with associated values. Here’s what I like about 
> that idea:
> 
> - The array consists of a 1-to-1 mapping regardless of the type of case. This 
> is more understandable and predictable in my opinion.
> - It provides the ability to cover more use-cases, while I believe the other 
> approach would prevent certain things from being possible in a dynamic way.
> - It still allows for developers to generate an array with the recursive 
> structure/Cartesian product as you described.
> 
> Here is an example that demonstrates the usefulness of constructors as the 
> included value for cases with associated values. I am providing a stubbed 
> implementation of a `cases` static var. The concept is that you have an enum 
> that defines a number of built-in color schemes, but provides a mechanism for 
> users to dynamically create their own color schemes.
> 
> https://gist.github.com/zef/c6069ed4ed11e41661bf 
> <https://gist.github.com/zef/c6069ed4ed11e41661bf>
> 
> I have a couple other real-world ideas for where this would be useful too.
> 
> 
> Downsides I can see to this approach:
> 
> - For enums that have disparate constructor signatures, [Any] would have to 
> be the return value of cases, which doesn’t seem ideal because the cases 
> array would always require some kind of manual manipulation to be useful.
> - There isn’t currently a way in the type system to know what case you are 
> working based on the constructor. For instance say two cases both have a 
> constructor of (String), you can’t determine which case you are working on 
> until you call the constructor to instantiate the case. This could be done by 
> looking at the index of the constructor in the cases array, but that is 
> brittle and messy. If there was a way to determine that more dynamically, 
> this would be more powerful and easier to use.
> 
> 
> 
> 
>> On Dec 23, 2015, at 6:00 AM, Pierre Monod-Broca via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> +1 for an ordered collection of all cases, it could be an ordered set to 
>> please proponents of a set.
>> 
>> I have no strong opinions about the name
>> `cases` is good, but I agree it begs to do ''for case in SomeEnum.cases''
>> `values` is good, and IMO it's consistent with `rawValue` when there is one, 
>> not confusing
>> 
>> -- 
>> Pierre
>> 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto: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

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to