Currently we can write a helper method to aid in getting the values inside the enum associated value. Below is a fully working implementation:
``` enum Package { case box(String, Int) case circular(String) var associated: Associated { return Associated(package: self) } struct Associated { let box: (String, Int)? let circular: (String)? init(package: Package) { switch package { case .box(let b): box = b circular = nil case .circular(let b): box = nil circular = b } } } } let b = Package.box("square", 5) b.associated.box?.0 // Optional("square") b.associated.box?.1 // Optional(5) b.associated.circular // nil let c = Package.circular("round") c.associated.box?.0 // nil c.associated.box?.1 // nil c.associated.circular // Optional("round") ``` I had to wedge in a special type called "Associated" and had to write some boiler-plate code to get this effect. It is quite predictable and can probably be done under the hood. I would of course prefer syntactic sugar to simplify it and turn ``` b.associated.box?.0 ``` into ``` b.box?.0 ``` On Sun, Jan 8, 2017 at 1:05 PM David Sweeris via swift-evolution < swift-evolution@swift.org> wrote: > > On Jan 8, 2017, at 06:53, Karim Nassar via swift-evolution < > swift-evolution@swift.org> wrote: > > One area of enums that I’d love to see some sugar wrapped around (and > perhaps this has already been discussed previously?) is extracting > associated values. > > There are many times where, given an enum like: > > enum Feedback { > case ok > case info(String) > case warning(String, Location) > case error(String, Location) > } > > I’d love it if we could tag the associated values with some semantic > accessor, perhaps borrowed from tuples: > > enum Feedback { > case ok > case info(msg: String) > case warning(msg: String, loc: Location) > case error(msg: String, loc: Location) > } > > then: > > let foo = self.getSomeFeedback() // -> Feedback > if let msg = foo.msg { // since not all cases can hold a ‘msg’ .msg is an > Optional > print(foo) > } > > > Can't remember if it's come up before, but +1. I can't count how many > times I've written something like: > enum Foo : CustomStringConvertible { > case c1(T1) > case c2(T2) > ... > case cN(TN) > > var description: String { > switch self { > case .c1(let val): return "\(val)" > case .c2(let val): return "\(val)" > ... > case .cN(let val): return "\(val)" > } > } > } > > Being able to simplify that to: > var description: String { > let nilDesc = "some appropriate description" > return "\(self.0 ?? nilDesc)" > } > > Would be great. > > - Dave Sweeris > _______________________________________________ > 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