> The proposed solution is to have single static initializer for each
> enum case that initializes stored properties. For example,

My opinions so far:

- Abusing rawValue is just that: an abuse.

- Using `where` just doesn't match the use of `where` elsewhere in the 
language; everywhere else, it's some kind of condition.

- Dictionaries are the most straightforward way to handle this with the current 
language, but their lack of exhaustiveness checking is a problem.

What I would do is borrow the "accessors" concept from the property behaviors 
proposal and extend it so that it supported both functions and variables. Then 
I would let you write this:

        enum Planet {
           accessor var mass: Float
           accessor var radius: Float
           
           case mercury {
              mass = 3.303e+23
              radius = 2.4397e6
           }
           case venus {
              mass = 4.869e+24
              radius = 6.0518e6
           }
           case earth {
              mass = 5.976e+24
              radius = 6.37814e6
           }
           case mars {
              mass = 6.421e+23
              radius = 3.3972e6
           }
           case jupiter {
              mass = 1.9e+27
              radius = 7.1492e7
           }
           case saturn {
              mass = 5.688e+26
              radius = 6.0268e7
           }
           case uranus {
              mass = 8.686e+25
              radius = 2.5559e7
           }
           case neptune {
              mass = 1.024e+26
              radius = 2.4746e7
           }
        }

You would also be able to declare methods like this; each implementation would 
just look like `methodName { code }`. And you could provide default 
implementations too:

        enum Planet {
           accessor var mass: Float
           accessor var radius: Float
           accessor var habitable: Bool = false
           
           case mercury {
              mass = 3.303e+23
              radius = 2.4397e6
           }
           case venus {
              mass = 4.869e+24
              radius = 6.0518e6
           }
           case earth {
              mass = 5.976e+24
              radius = 6.37814e6
              habitable = true
           }
           case mars {
              mass = 6.421e+23
              radius = 3.3972e6
           }
           case jupiter {
              mass = 1.9e+27
              radius = 7.1492e7
           }
           case saturn {
              mass = 5.688e+26
              radius = 6.0268e7
           }
           case uranus {
              mass = 8.686e+25
              radius = 2.5559e7
           }
           case neptune {
              mass = 1.024e+26
              radius = 2.4746e7
           }
        }

-- 
Brent Royal-Gordon
Architechies

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

Reply via email to