This is precisely what a struct is for, why would you want to be able to do 
this with enums instead?

> Hi all,
> I would like to know you opinion on one feature I feel would be a real 'nice 
> to have' 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.
> 
> Please take a look at an example to illustrate this:
> ```swift
> enum Format {
> case SMALL(30, 30)
> case MEDIUM(60, 60)
> case LARGE(120, 120)
> var width: Double
> var height: Double
> init(width: Double, height: Double) {
> self.width = width
> self.height = height
> }
> }
> ```
> 
> Similar feature is currently available for example in Java 
> (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html).
> 
> Currently there are at least tree ways to solve this limitation.
> 
> 1. use enumeration type with custom struct as a rawValue cons:
> a lot of additional code to define structs and implement 
> `ExpressibleByStringLiteral`
> not really possible for more complex types, where a complex string parser 
> would be required
> 
> example:
> ```swift
> struct FormatStruct: ExpressibleByStringLiteral, Equatable {
> var width: Int = 0
> var height: Int = 0
> public init(width: Int, height: Int) {
> self.width = width
> self.height = height
> }
> public init(stringLiteral value: String) {
> let set = CharacterSet(charactersIn: "x")
> let values = value.components(separatedBy: set)
> if let width = Int(values[0]), let height = Int(values[1]) {
> self.init(width: width, height: height)
> } else {
> self.init(width: 0, height: 0)
> }
> }
> init(extendedGraphemeClusterLiteral value: String){
> self.init(stringLiteral: value)
> }
> init(unicodeScalarLiteral value: String) {
> self.init(stringLiteral: value)
> }
> static func ==(lhs: FormatStruct, rhs: FormatStruct) ->Bool {
> return (lhs.width == rhs.width)&&(lhs.height == rhs.height)
> }
> static let A = FormatStruct(width: 30, height: 30)
> }
> enum Format: FormatStruct {
> case SMALL = "30x30"
> case MEDIUM = "60x60"
> case LARGE = "120x120"
> var width: Int {
> return rawValue.width
> }
> var height: Int {
> return rawValue.height
> }
> }
> ```
> 
> 2. static struct values to mimic enumeration type
> cons:
> enum should be used to define a closed set of possible values
> 
> example:
> ```swift
> struct Format: ExpressibleByStringLiteral, Equatable {
> var width: Int = 0
> var height: Int = 0
> public init(width: Int, height: Int) {
> self.width = width
> self.height = height
> }
> static let SMALL = FormatStruct(width: 30, height: 30)
> static let MEDIUM = FormatStruct(width: 60, height: 60)
> static let LARGE = FormatStruct(width: 120, height: 120)
> }
> ```
> 
> 3. define enum with getters
> cons:
> additional, repeated `switch` clauses in getters
> 
> example:
> ```swift
> 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 } } }
> ```
> 
> 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?
> 
> best regards
> --
> | Mateusz Malczak_______________________________________________
> 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