swiftswiftuiswiftui-charts

Swift: Make Int Enum conform to Plottable protocol in order to show a legend using Swift Charts


I am trying to make my Int enum conform to Plottable in order to use a legend in my Swift Charts. I'm not sure if I've understood the way on how to implement it correctly. Here is how my enum:

enum Type: Int, CaseIterable, Identifiable, Plottable {
      init?(primitivePlottable: Int) {
           self.init(rawValue: primitivePlottable)
    }

      var primitivePlottable: Int {
           return rawValue
    }

      var id: Int {
           return rawValue
    }

      case first = 32
      case second = 434

    }
}

My chart looks like this:

 Chart {
      if let allObejcts = object.objects(type: Type.first) {
           ForEach(allObejcts) { object in
                BarMark(
                     x: .value("#", object.indexInSegment),
                     y: .value("Distance", object.distance)
                )
                .foregroundStyle(by: .value("type", object.type))
            }
        }
    }
.chartLegend(position: .bottom, spacing: 8)
.chartLegend(SwiftUI.Visibility.visible)
.chartForegroundStyleScale([
                    Type.first: Color.pink,
                    Type.second: Color.yellow
])
.frame(minHeight: 200)

chart screenshot Despite compiling and running with no errors, the legends isn't visible. 🤷‍♂️


Solution

  • As documentation states for enum it should be String as raw type

    enter image description here

    so making next works (tested with Xcode 14b5 / iOS 16)

    enum Type: String, CaseIterable, Identifiable, Plottable {
        init?(primitivePlottable: String) {
            self.init(rawValue: primitivePlottable)
        }
        
        var primitivePlottable: String {
            return rawValue
        }
        
        var id: String {
            return rawValue
        }
        
        case first = "32"
        case second = "434"
        
    }