I think he wants convenience accessors for the associated values; the problem is that in his example, he shouldn’t even be using associated values at all. The example was about getting a size (a pair of numbers) based on the case of an enum. In that case, you need to write a switch statement to return the size. You can either do that every time you need a size from the enum, or you can extend the enum and make it a computed property.
I do sometimes wonder why we don’t have better accessors. We have the “if case let” thing, but that’s horrible. On the rare occasion where it’s appropriate, it always takes me 4 or 5 attempts to get the incantation correct (single equals!): if case .anotherThing(let theError) = myValue { print(“oh, no! an error! \(theError)”) } Urf. - Karl > On 12 Oct 2016, at 17:12, Xiaodi Wu <xiaodi...@gmail.com> wrote: > > > > On Wed, Oct 12, 2016 at 10:07 AM, Karl via swift-evolution > <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: > Not at all - his proposal looks like the enum cases have an associated value, > when that is exactly what you _don’t_ want. It’s wasted storage because they > have a handful of known values. > > It’s a PITA, I get it, I go through it all the time, too; but really this is > the very definition of a computed property. There is nothing to be stored > here. Meanwhile, something like: > > enum Something { > case oneThing(UIView) > case anotherThing(Error) > case yetAnotherThing(Int) > } > > …which is dangerously similar to Braeden’s example, really does store an > instance of UIView or Error or Int along with it. The size of the value is > the maximum of those, plus a couple of bits to record which case it is and > what the type of the payload is. > > Confusing those things just because you don’t like writing switch statements > would be bad, IMO. It’s not that much code, and once you’ve done a few of > them you can make it quite compact. If you have a boatload of associated > values, wrap them in a struct. > Some more convenient generated accessors for the associated data might be > nice, but that’s been proposed and discussed to death. Others who have > followed the lists more closely can maybe tell you why we don’t have an > accepted proposal for it. > > I agree with Karl on this. There should be clarity here as to what's > proposed. If it's a change to how enums are laid out in memory, then you'll > need to show we're not sacrificing performance/size in the overwhelmingly > more common use cases, and why the extra storage is useful in the first > place; if it's syntactic sugar, that has already been proposed multiple times > and really isn't in scope for this phase of Swift 4--nor does it really > enable any new use cases not possible now. > > - Karl > > > On 12 Oct 2016, at 13:52, Rien <r...@balancingrock.nl> wrote: > > > > I read Braeden’s example such that this proposal is in reality “just” > > syntactic sugar. AFAIAC it does not change how enums are implemented after > > compilation. > > > > Like sugar, it makes working with enums clearer and therefore easier. All > > initialisation values are defined right there with the ‘case’ instead of > > hidden in a tree of multiple ‘var’s. > > While I was sceptical about this proposal, Braeden’s example makes it a +1. > > > > Rien. > > > > Btw: I made the almost identical suggestion you did ;-) > > > > > >> On 12 Oct 2016, at 13:31, Karl <razie...@gmail.com > >> <mailto:razie...@gmail.com>> wrote: > >> > >> I very much disagree with the proposal, and all of the things supporting > >> it (like deriving enums from other types and whatnot). I think you need to > >> take a step up from caring about whether it’s a struct or enum and think > >> about what you are trying to model; that will guide you towards the > >> correct type(s) to use. > >> > >> You have only shown a handful of fixed size values, so I would suggest a > >> computed property in your case: > >> > >> enum FixedSize { > >> case small > >> case medium > >> case large > >> > >> struct Size { let width : Int; let height: Int } > >> > >> var size : Size { > >> switch self { > >> case .small: return Size(width: 30, height: 30) > >> // … etc > >> } > >> } > >> } > >> > >> There is no need for these sizes to be stored at all. If you want them > >> baked in to your enum’s values, clearly you expect them to be specific > >> values. It’s more efficient to just drop the stored data altogether in > >> this case; this enum will get lowered in to single byte, which is more > >> efficient to store and transport. > >> > >> Karl > >> > >>> On 12 Oct 2016, at 13:15, Mateusz Malczak via swift-evolution > >>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: > >>> > >>>> Mateusz, you lost me with “store some extra data”. > >>>> Does that mean something extra besides the code that Braeden suggested? > >>> > >>> What I meant by “store some extra data” was, to be able to define > >>> immutable properties of any type, as a part of enum instead of > >>> defining getters witch switches. I think Braeden example explains the > >>> whole idea of that proposal. > >>> > >>> -- > >>> | Mateusz Malczak > >>> > >>> > >>> 2016-10-12 8:42 GMT+02:00 Rien <r...@balancingrock.nl > >>> <mailto:r...@balancingrock.nl>>: > >>>> I’d give a +1 for the suggestion of Braeden. > >>>> > >>>> Mateusz, you lost me with “store some extra data”. > >>>> Does that mean something extra besides the code that Braeden suggested? > >>>> > >>>> Rien. > >>>> > >>>>> On 12 Oct 2016, at 00:13, Mateusz Malczak via swift-evolution > >>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: > >>>>> > >>>>> That's exactly what this proposal is about. I would like to > >>>>> keep all enum properties but add an extra feature, so that enums can > >>>>> store some extra data. > >>>>> -- > >>>>> | Mateusz Malczak > >>>>> +------------------------------- > >>>>> | mate...@malczak.info <mailto:mate...@malczak.info> > >>>>> | http://malczak.info <http://malczak.info/> > >>>>> > >>>>> > >>>>> 2016-10-11 23:42 GMT+02:00 Braeden Profile <jhaezhy...@gmail.com > >>>>> <mailto:jhaezhy...@gmail.com>>: > >>>>>> So, just to recap, the proposed solution is to help enums expose > >>>>>> associated > >>>>>> values via properties, and is not to create enums that are open to > >>>>>> extra > >>>>>> unnamed cases (RectSize(width:0,height:10))? What I see is that enums > >>>>>> would > >>>>>> still maintain their standing where an instance is just a selection of > >>>>>> a > >>>>>> finite number of options, possibly with data attached. In proposal 1, > >>>>>> we > >>>>>> want some sort of syntax where this… > >>>>>> > >>>>>> enum RectSize > >>>>>> { > >>>>>> let height:Int > >>>>>> let width:Int > >>>>>> case small(width: 30, height: 30) > >>>>>> case medium(width: 60, height: 60) > >>>>>> case large(width: 120, height: 120) > >>>>>> } > >>>>>> > >>>>>> …is syntactically just like writing this… > >>>>>> > >>>>>> enum RectSize > >>>>>> { > >>>>>> case small > >>>>>> case medium > >>>>>> case large > >>>>>> var height:Int > >>>>>> { > >>>>>> switch self > >>>>>> { > >>>>>> case .small: return 30 > >>>>>> case .medium: return 60 > >>>>>> case .large: return 90 > >>>>>> } > >>>>>> } > >>>>>> let width:Int > >>>>>> { > >>>>>> switch self > >>>>>> { > >>>>>> case .small: return 30 > >>>>>> case .medium: return 60 > >>>>>> case .large: return 90 > >>>>>> } > >>>>>> } > >>>>>> } > >>>>>> > >>>>>> …right? That way, you can write this: > >>>>>> > >>>>>> var size: RectSize = .small > >>>>>> size.height == 30 // true > >>>>>> size.rawValue // Error: RectSizes has no property `rawValue`. > >>>>>> size.height = 40 // Error: `height` is immutable > >>>>>> size = .medium > >>>>>> > >>>>>> I think we were also (separately) proposing to extend `rawValue` to > >>>>>> take all > >>>>>> kinds of statically known values, like structs or tuples. Doing that > >>>>>> would > >>>>>> accomplish much of the same thing. > >>>>>> > >>>>>> Someone fact-check me here! I really do think something like this > >>>>>> would be > >>>>>> a good idea, if we could get the right syntax. > >>>>>> > >>>>>> On Oct 11, 2016, at 7:06 AM, Mateusz Malczak via swift-evolution > >>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: > >>>>>> > >>>>>> Hi, > >>>>>> I think we are here discussing two different aspects of introducing > >>>>>> this new feature - code syntax and underlying implementation. > >>>>>> In terms of code syntax I would go with first proposal as it seems to > >>>>>> me the simplest approach. When it comes to underlying implementation, > >>>>>> I can imagine that during compilation internal struct is created, as > >>>>>> well as any required property getters. This way you could get a > >>>>>> variation of rawValue implementation, at least from theoretical point > >>>>>> of view :D > >>>>>> > >>>>>> -- > >>>>>> | Mateusz Malczak > >>>>>> +------------------------------- > >>>>>> | mate...@malczak.info <mailto:mate...@malczak.info> > >>>>>> | http://malczak.info <http://malczak.info/> > >>>>>> > >>>>>> > >>>>>> 2016-10-10 23:42 GMT+02:00 Haravikk <swift-evolut...@haravikk.me > >>>>>> <mailto:swift-evolut...@haravikk.me>>: > >>>>>> > >>>>>> > >>>>>> On 10 Oct 2016, at 20:34, Mateusz Malczak <mate...@malczak.info > >>>>>> <mailto:mate...@malczak.info>> wrote: > >>>>>> > >>>>>> I know, but what I'm saying is that this problem could be solved in the > >>>>>> multiple values case by allowing tuples as raw values for enums, since > >>>>>> that > >>>>>> would allow you to specify both width and height. So it'd look > >>>>>> something > >>>>>> like this: > >>>>>> > >>>>>> > >>>>>> We have three different possible solution > >>>>>> 1. stored properties defined as part of enumeration type > >>>>>> enum RectSizes: MyRect > >>>>>> { > >>>>>> let height:Int > >>>>>> let width:Int > >>>>>> case Small(width: 30, height: 30) > >>>>>> case Medium(width: 60, height: 60) > >>>>>> case Large(width: 120, height: 120) > >>>>>> } > >>>>>> > >>>>>> 2. struct as rawValue > >>>>>> struct MyRect > >>>>>> { > >>>>>> var height:Int > >>>>>> var width:Int > >>>>>> var area:Int {return height:Int*width} > >>>>>> } > >>>>>> > >>>>>> enum RectSizes: MyRect > >>>>>> { > >>>>>> case Small(30,30) > >>>>>> case Medium(60,60) > >>>>>> case Large(120,120) > >>>>>> } > >>>>>> > >>>>>> 3. tuples as rawValue > >>>>>> enum Format : (width:Int, height:Int) { > >>>>>> case small(30, 30) > >>>>>> case medium(60, 60) > >>>>>> case large(120, 120) > >>>>>> > >>>>>> var width:Int { return self.rawValue.width } > >>>>>> var height:Int { return self.rawValue.height } > >>>>>> } > >>>>>> > >>>>>> Solutions 2 and 3 are quire similar, to get value of a stored property > >>>>>> we need to use rawValue or define value getters. In addition in > >>>>>> solution 2 we define an additional data type just to be used as an > >>>>>> enumeration type rawValue type. In my opinion, first approach would be > >>>>>> a best solution, type definition is clear and self-explanatory because > >>>>>> it is similar to how enums/classes are defined. > >>>>>> > >>>>>> > >>>>>> -- > >>>>>> | Mateusz Malczak > >>>>>> > >>>>>> > >>>>>> Actually I'd say your option 2 here is more similar to option 1 (you > >>>>>> seem to > >>>>>> be using a struct to define the stored properties instead). The issue > >>>>>> here > >>>>>> is that storing properties conflicts with what you're actually doing, > >>>>>> which > >>>>>> is storing case-specific values, which is what rawValue already does, > >>>>>> it's > >>>>>> just too limited for your current use-case (multiple values). > >>>>>> > >>>>>> The complete solution would be to introduce the concept of tuples as > >>>>>> literals (even though they can't currently conform to types); this > >>>>>> would > >>>>>> make it a lot easier to support the use of any type as a fixed value > >>>>>> for > >>>>>> each case (not just tuples). For example, say we introduced as new > >>>>>> protocol: > >>>>>> > >>>>>> protocol ExpressableByTuple { > >>>>>> associatedtype TupleType // somehow force this to be a tuple or > >>>>>> ExpressableByType type > >>>>>> init(tupleLiteral:TupleType) > >>>>>> } > >>>>>> > >>>>>> With a bit of magic all tuples could conform to this protocol with > >>>>>> themselves as the literal type, allowing us to use them as enum raw > >>>>>> values; > >>>>>> likewise this could then be used to more easily enable any custom > >>>>>> struct/class for storage in enum cases, as instead of supporting their > >>>>>> constructors directly we can just support construction via a tuple > >>>>>> literal. > >>>>>> > >>>>>> > >>>>>> My other reason I don't favour option 1, while it looks a bit > >>>>>> prettier, is > >>>>>> that it's a bit confusing; enums have two types of stored properties, > >>>>>> ones > >>>>>> that can be changed (and inspected) which is what you get when you > >>>>>> declare > >>>>>> case small(Int, Int) for example, these are stored as part of the enum > >>>>>> itself (so in that example it's 17-bytes on a 64-bit system). However > >>>>>> rawValues are more like constants/static values, and don't increase > >>>>>> the size > >>>>>> of the type, and I just feel that this is the right way to do what > >>>>>> you're > >>>>>> proposing. > >>>>>> > >>>>>> _______________________________________________ > >>>>>> swift-evolution mailing list > >>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org> > >>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution > >>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution> > >>>>>> > >>>>>> > >>>>> _______________________________________________ > >>>>> swift-evolution mailing list > >>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org> > >>>>> https://lists.swift.org/mailman/listinfo/swift-evolution > >>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution> > >>>> > >>> _______________________________________________ > >>> swift-evolution mailing list > >>> swift-evolution@swift.org <mailto:swift-evolution@swift.org> > >>> https://lists.swift.org/mailman/listinfo/swift-evolution > >>> <https://lists.swift.org/mailman/listinfo/swift-evolution> > >> > > > > _______________________________________________ > swift-evolution mailing list > swift-evolution@swift.org <mailto:swift-evolution@swift.org> > https://lists.swift.org/mailman/listinfo/swift-evolution > <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution