

SwiftUIのImageでSF
Symbolsを表示させる際のオプションとして`.symbolRenderingMode(SymbolRenderingMode)`が用意されていますが、これをUI側で選択できるようにPickerとForEachで全てのオプションを表示できるようにしたいのですが、以下のように実装したのですが、実行時にエラーとなってしまいます。

## エラー内容

`Thread 1: EXC_BAD_ACCESS (code=2, address=0x16d89fff0)`

## 謎

`SymbolRenderingMode`と同じようなものとして`SymbolVariants`があるのですが、こちらは同じような実装をしても問題なく実行が可能でした。

違いは`SymbolVariants`はデフォルトでHashableに準拠していることぐらいです。

## ソースコード

[code]

    import SwiftUI
    
    extension SymbolRenderingMode: CaseIterable, Identifiable, RawRepresentable, Hashable {
      public var id: String {
        return self.rawValue
      }
      
      public init?(rawValue: String) {
        switch rawValue {
          case "palette": self = .palette
          case "multicolor": self = .multicolor
          case "hierarchical": self = .hierarchical
          case "monochrome": self = .monochrome
          default:
            return nil
        }
      }
    
      public var rawValue: String {
        switch self {
          case .palette: return "palette"
          case .multicolor: return "multicolor"
          case .hierarchical: return "hierarchical"
          case .monochrome: return "monochrome"
          default: fatalError()
        }
      }
    
      public static var allCases: [SymbolRenderingMode] {
        return [.monochrome, .hierarchical, .multicolor, .palette]
      }
    }
    
    struct TestView: View {
      var body: some View {
        ForEach(SymbolRenderingMode.allCases) { mode in
          Text(mode.rawValue)
        }
      }
    }
    
[/code]


CC BY-SA 4.0
2022-04-26T12:18:12.593
88517
2022-04-26T12:20:14.760
40856
question
swift swiftui
SymbolRenderingModeをSwiftUIのForEachで選択させたいが実行時エラー(Thread 1: EXC_BAD_ACCESS)になってしまう。


SymbolRenderingModeをバインド？する新しい列挙型を用意すればエラーなく動作しますが、元のコードが動作しない理由を知りたいです。

[code]

    enum BindSymbolRenderingMode: String, CaseIterable, Hashable, Identifiable {
      case palette
      case multicolor
      case hierarchical
      case monochrome
    
      var id: String {
        return self.rawValue
      }
    
      var bind: SymbolRenderingMode {
        switch self {
          case .palette: return .palette
          case .multicolor: return .multicolor
          case .hierarchical: return .hierarchical
          case .monochrome: return .monochrome
        }
      }
    }
    
[/code]


CC BY-SA 4.0
2022-04-26T12:20:14.760
88518
2022-04-26T12:20:14.760
40856
88517
answer