简体   繁体   中英

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)

图表截图 Despite compiling and running with no errors, the legends isn't visible. ♂️

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

在此处输入图像描述

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"
    
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM