<div dir="ltr"><div style="white-space:pre-wrap">Hi all,<br>I would like to know you opinion on one feature I feel would be a real &#39;nice to have&#39; extension to currently available enumeration type. Which is an enumeration type with stored properties. It is sometimes useful to store some extra informations along with enumeration cases. Idea here is to add possibility to define an enumeration type with stored, immutable, properties, defined at compile time for all cases. In opposition to currently available associated values, stored properties should be constant values stored as a part of enumeration case. Proposed feature would be treated as a new feature along the associated values and raw values. </div><div style="white-space:pre-wrap"><br></div><div style="white-space:pre-wrap">Please take a look at an example to illustrate this:</div><div style="white-space:pre-wrap">```swift<br>enum Format {<br>    case SMALL(30, 30)<br>    case MEDIUM(60, 60)<br>    case LARGE(120, 120)<br>    var width: Double<br>    var height: Double<br>    init(width: Double, height: Double) {<br>        self.width = width<br>        self.height = height<br>    }<br>}</div><div style="white-space:pre-wrap">```<br><div><br class="gmail-Apple-interchange-newline">Similar feature is currently available for example in Java (<a href="http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html" target="_blank">http://docs.oracle.com/<wbr>javase/tutorial/java/javaOO/<wbr>enum.html</a>). </div></div><div style="white-space:pre-wrap"><br>Currently there are at least tree ways to solve this limitation. <br><br></div><div style="white-space:pre-wrap">1. use enumeration type with custom struct as a rawValue
cons: </div><div style="white-space:pre-wrap">a lot of additional code to define structs and implement `ExpressibleByStringLiteral`</div><div style="white-space:pre-wrap">not really possible for more complex types, where a complex string parser would be required</div><div style="white-space:pre-wrap"><br></div><div style="white-space:pre-wrap">example:</div><div style="white-space:pre-wrap">```swift<br>struct FormatStruct: ExpressibleByStringLiteral, Equatable {<br>    var width: Int = 0<br>    var height: Int = 0<br>    public init(width: Int, height: Int) {<br>        self.width = width<br>        self.height = height<br>    }<br>    public init(stringLiteral value: String) {<br>        let set = CharacterSet(charactersIn: &quot;x&quot;)<br>        let values = value.components(separatedBy: set)<br>        if let width = Int(values[0]), let height = Int(values[1]) {<br>            self.init(width: width, height: height)<br>        } else {<br>            self.init(width: 0, height: 0)<br>        }<br>    }<br>    init(<wbr>extendedGraphemeClusterLiteral value: String){<br>        self.init(stringLiteral: value)<br>    }<br>    init(unicodeScalarLiteral value: String) {<br>        self.init(stringLiteral: value)<br>    }<br>    static func ==(lhs: FormatStruct, rhs: FormatStruct) -&gt; Bool {<br>        return (lhs.width == rhs.width) &amp;&amp; (lhs.height == rhs.height)<br>    }<br>    static let A = FormatStruct(width: 30, height: 30)<br>}<br>enum Format: FormatStruct {<br>    case SMALL = &quot;30x30&quot;<br>    case MEDIUM = &quot;60x60&quot;<br>    case LARGE = &quot;120x120&quot;<br>    var width: Int {<br>        return rawValue.width<br>    }<br>    var height: Int {<br>        return rawValue.height<br>    }<br>}<br>```</div><div style="white-space:pre-wrap"><br>2. static struct values to mimic enumeration type</div><div style="white-space:pre-wrap">cons:</div><div style="white-space:pre-wrap">enum should be used to define a closed set of possible values</div><div style="white-space:pre-wrap"><br></div><div style="white-space:pre-wrap">example:<br>```swift<br>struct Format: ExpressibleByStringLiteral, Equatable {<br>    var width: Int = 0<br>    var height: Int = 0<br>    public init(width: Int, height: Int) {<br>        self.width = width<br>        self.height = height<br>    }<br>    static let SMALL = FormatStruct(width: 30, height: 30)<br>    static let MEDIUM = FormatStruct(width: 60, height: 60)<br>    static let LARGE = FormatStruct(width: 120, height: 120)<br>}<br>```</div><div style="white-space:pre-wrap"><br>3. define enum with getters</div><div style="white-space:pre-wrap">cons:</div><div style="white-space:pre-wrap">additional, repeated `switch` clauses in getters</div><div style="white-space:pre-wrap"><br></div><div style="white-space:pre-wrap">example:</div><div style="white-space:pre-wrap">```swift</div><span style="white-space:pre-wrap">enum Format2 {
    case SMALL
    case MEDIUM
    case LARGE
    
    var width: Int {
        switch self {
        case .SMALL: return 30
        case .MEDIUM: return 60
        case .LARGE: return 120
        }
    }
    
    var height: Int {
        switch self {
        case .SMALL: return 30
        case .MEDIUM: return 60
        case .LARGE: return 120
        }
    }
}</span> <div style="white-space:pre-wrap">```<br></div><div style="white-space:pre-wrap"><br></div><div style="white-space:pre-wrap">What is your opinion on this feature? Or maybe that was not implemented for some reason - if so can I get an few word of explaination what was the motivation for not adding this to the language?</div><div style="white-space:pre-wrap"><br>best regards<br>--<br>| Mateusz Malczak</div></div>