88451


複数のカラーセットを作って、ボタンで一括で切り替えるという仕様にしたいのですが、ボタンの実装の部分で行き詰まっています。

以下のような記述で切り替えられるというのはわかるのですが、App上でボタンの実装の仕方がどうしてもわかりませんでした(View Modeifierを使う？）

[code]

    static let theme = ColorThemeOne()
    static let theme = ColorThemeTwo()
    
[/code]

初心者のため、曖昧な質問で申し訳ないのですが、ご教授いただける方いたら助かります。

**現状のコード:**

[code]

    import SwiftUI
    
    extension Color {
        init(){
            var theme:some View
            self.theme = ColorThemeTwo()
        }
    }
    
    struct ContentView: View {
        var body: some View {
    
            ZStack {
    
                Color.theme.baseColor
                    .ignoresSafeArea()
                Circle()
                    .foregroundColor(Color.theme.circleColor)
                    .frame(width:200,height:200)
                Text("Change Color!")
                    .font(.title)
                    .foregroundColor(.red)
                    .onTapGesture {
                        //どのように実装したらいいでしょうか
                    }
            }
        }
    }
    
    struct ColorThemeOne {
        let baseColor = Color(.orange)
        let circleColor = Color(.blue)
        let textColor = Color(.red)
    }
    
    struct ColorThemeTwo {
        let baseColor = Color(.purple)
        let circleColor = Color(.green)
        let textColor = Color(.black)    
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    
[/code]


CC BY-SA 4.0
2022-04-22T02:32:56.347
88444
2022-04-22T08:23:01.743
2022-04-22T03:05:52.670
3060
52314
question
swift swiftui
カラーセットを作ってボタンで切り替えたい


enumで色の組み合わせ(struct ColorSet)を作ってそれを切り替えていけばうまく変更可能です。

[code]

    import SwiftUI
    
    struct ColorSet {
      let baseColor: Color
      let circleColor: Color
      let textColor: Color
    }
    
    enum ColorMode {
      case first
      case second
    
      var colorSet: ColorSet {
        switch self {
          case .first:
            return ColorSet(baseColor: .orange, circleColor: .blue, textColor: .red)
          case .second:
            return ColorSet(baseColor: .purple, circleColor: .green, textColor: .black)
        }
      }
    }
    
    struct ContentView: View {
      @State var mode: ColorMode = .first
    
      var body: some View {
        VStack {
          mode.colorSet.baseColor
            .ignoresSafeArea()
          Circle()
            .foregroundColor(mode.colorSet.circleColor)
            .frame(width:200, height:200)
          Text("Change Color!")
            .font(.title)
            .foregroundColor(mode.colorSet.textColor)
            .onTapGesture {
              mode = .second
            }
        }
      }
    }
    
[/code]


CC BY-SA 4.0
2022-04-22T08:23:01.743
88451
2022-04-22T08:23:01.743
40856
88444
answer