[swift-evolution] List of all Enum values (for simple enums)

Kevin Wooten kdubb at me.com
Wed Dec 9 06:37:11 CST 2015

I don’t think this is overcomplicating things at all.  I see many useful cases for this.

I would suggest a simple change to Enumerable…

protocol Enumerable : CustomStringConvertible, CustomDebugStringConvertible {

The number of times the enumeration value name is needed at runtime is just too great.

> On Dec 9, 2015, at 5:05 AM, Brent Royal-Gordon via swift-evolution <swift-evolution at swift.org> wrote:
>>    extension Attribute {
>>        static var allValues: [Attribute] {
>>            return [.Title, .Date]  // imagine this x100, and not autogenerated :(
>>        }
>>    }
>> It would be nice if the compiler generated this for us.
> You know, I was thinking about this the other day when the topic of numeric minimum/maximums came up.
> In some sense these are related ideas. These types have in common that they have a particular finite, easily-calculated set of possible values, and it’s convenient to be able to look at that set in various ways. This has the feel of a protocol:
> 	protocol Enumerable {
> 		typealias Enumeration: SequenceType where Generator.Element == Self
> 		var allValues: Enumeration
> 	}
> For a simple enum, `Enumeration` would be something like an `Array` or `Set`, and `allValues` would primarily be iterated over; for an integer type, `Enumeration` would be a range and `allValues` would primarily have its `first` and `last` elements examined. (Well, there’s a problem with using a range. A `Range<T: IntegerType>` can never include `T.max`, because then its `endIndex` would have to be `T.max + 1`, which is by definition not representable in `T`. But you could imagine a range-like type without this limitation.) However, in each case there are some fairly useless operations exposed by `allValues`, and I’m not sure if I like that.
> One interesting thing I noticed: enums with associated values could also be made `Enumerable`, as long as all associated values are `Enumerable` and the enum is not recursive. For instance:
> 	enum Foo {
> 		case Alice, Bob
> 	}
> 	enum Bar {
> 		case Charlie (Foo), Eve (Foo, Foo)
> 	}
> 	Bar.allValues   // => [ .Charlie(.Alice), .Charlie(.Bob), .Eve(.Alice, .Alice), .Eve(.Alice, .Bob), .Eve(.Bob, .Alice), .Eve(.Bob, .Bob) ]
> This is even in principle true of associated values of type `Int`, although obviously the set of possible values for `Int` would be so large that it would have to be generated lazily (not to mention that I can’t see much practical use for it). This would also imply that `Optional<T: Enumerable>` would be `Enumerable`, with an `allValues` consisting basically of `[.None] + Wrapped.all.map(.Some)`.
> Anyway, I’m not sure if what I’m describing here is a good idea. It might be overcomplicating things, and some parts of it would probably be difficult to implement. But I thought it was an interesting observation.
> -- 
> Brent Royal-Gordon
> Architechies
> _______________________________________________
> 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