[swift-evolution] [Idea] allValues for RawRepresentable enums

Kevin Randrup kevinrandrup at gmail.com
Thu Mar 24 16:44:51 CDT 2016


My bad, I didn't see the proposal listed in evolution and didn't think to
check the pull requests.

 - Kevin Randrup

On Thu, Mar 24, 2016 at 5:28 PM, Jacob Bandes-Storch <jtbandes at gmail.com>
wrote:

> Please see existing discussion at
> https://github.com/apple/swift-evolution/pull/114.
>
> As discussed on #199 <https://github.com/apple/swift-evolution/pull/199>,
> I believe we should continue discussing this (preferably on the same thread
> as the original, or a new one that references it), but I'm currently in the
> middle of a move and multiple travel plans, so I can't spearhead this for
> another week or two.
>
> Jacob
>
> On Thu, Mar 24, 2016 at 2:23 PM, Kevin Randrup via swift-evolution <
> swift-evolution at swift.org> wrote:
>
>> # Summary
>> Add an allValues function to all enums that are RawRepresentable to
>> access, iterate over, and count all of the values of an enum. The usage is
>> general enough that I believe it would be a great addition to the language.
>>
>> This can currently be "hacked" in a few different ways by using the
>> RawRepresentable initializer (SO link
>> <http://stackoverflow.com/questions/24007461/how-to-enumerate-an-enum-with-string-type/24137319#24137319>
>> ).
>>
>> I'm presenting this idea here for discussion and feedback before I write
>> up a formal proposal.
>>
>> # Limits
>> Having an allValues method would only be logical for enums which do not
>> have associated values. This limits the enum to RawRepresentable enums and
>> basic enums (is there a name for an enum without associated values and no
>> raw value?).
>> I'm working with the assumption that this would only be done with
>> RawRepresentable enums but it may be the case that basic enums can be
>> included easily.
>>
>> # Examples
>> All examples as source code are available as a gist
>> <https://gist.github.com/kevinrandrup/00448c37ae9c20fa4eab>.
>>
>> enum CommandLineFlag : String {
>>     case Version = "--version"
>>     case Help = "--help"
>>     case Start = "--start"
>> }
>>
>> func displayHelp() {
>>     print("Available flags\n")
>>     for flag in CommandLineFlag.allValues {
>>         print("\(flag): \(flag.rawValue)")
>>     }
>> }
>>
>>
>>
>> Representing the structure and implementing UITableViewDataSource methods
>> enum RecipeTableViewSection : Int {
>>     case Header
>>     case Details
>> }
>>
>> enum RecipeHeaderRow : Int {
>>     case Name
>>     case Image
>> }
>>
>> enum RecipeDetailRow : Int {
>>     case Ingredients
>>     case Cost
>>     case PreparationTime
>> }
>>
>> // UITableViewDataSource implementation
>> func tableView(tableView: UITableView, numberOfRowsInSection section:
>> Int) -> Int {
>>     switch RecipeTableViewSection(rawValue: section)! {
>>     case .Header:
>>         return RecipeHeaderRow.allValues().count
>>     case .Details:
>>         return RecipeDetailRow.allValues().count
>>     }
>> }
>>
>> func numberOfSectionsInTableView(tableView: UITableView) -> Int {
>>     return RecipeTableViewSection.allValues().count
>> }
>>
>> # Decisions/Questions
>>
>> 1. Function vs. computed property vs. stored static variable
>>
>> static func allValues() -> [CommandLineFlag] {
>>   return [Version, Help, Start]
>> }
>>
>>
>> static var allValues: [CommandLineFlag] {
>>   return [Version, Help, Start]
>> }
>>
>> static let allValues = [Version, Help, Start]
>>
>>
>>    - Currently leaning towards computed property
>>       - Computed property > function - allValues doesn't do anything
>>       besides return a value so it doesn't need to be a function
>>       - Computed property > stored static variable - Will not increase
>>       the memory usage of the program
>>       - A change between computed and stored static property would not
>>    be a source breaking change if it turns out one is better than the other.
>>
>> 2. Set vs. Array
>>
>>    - Set - There are no duplicate values and RawRepresentable enums
>>    already conform to Hashable/Equatable.
>>    - Array - Preserves the cases' declaration order
>>
>> 3. Should allValues consist of the enum type or RawValue?
>> (CommandLineFlag vs. String)
>>
>>    - Strongly learning towards enum type
>>    - However, either one could be converted to the other and one could
>>    simply be a computed property of the other.
>>
>>
>> If you have better examples and use cases, I would love to hear about
>> them before writing the proposal.
>>
>>  - Kevin Randrup
>>
>> _______________________________________________
>> 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/20160324/1fb9c582/attachment.html>


More information about the swift-evolution mailing list