首页 > 解决方案 > 在 SwiftUI 中使用三元运算符会导致类型不匹配错误,为什么?

问题描述

我目前一直在使用这个Environment变量来调整我的应用程序的内容DarkLight模式。

@Environment(.colorScheme) var colorScheme

我遇到的问题是使用它var来有条件地设置按钮样式。这种方法效果很好。

if colorScheme == .dark {
                    Button("Create Account", action: {
                        
                    }).buttonStyle(CinderDarkButtonStyle(geometry: geometry))
                } else {
                    Button("Create Account", action: {
                        
                    }).buttonStyle(CinderLightButtonStyle(geometry: geometry))
                }

然而,这样做会导致我在一个相对简单的用户界面上到处重复代码。每当我尝试以这种方式执行此操作时,我都会遇到错误,指出我的类型不匹配。

Button("Create Account", action: {
                            //DO SOME ACTION
                        }).buttonStyle(
colorScheme == .dark ? 
     CinderDarkButtonStyle(geometry: geometry) :
     CinderLightButtonStyle(geometry: geometry)
)

标签: swiftswiftui

解决方案


除了@Don所说的额外)CinderDarkButtonStyle还有CinderLightButtonStyle不同的结构。它们不是同一类型。

您可以做的是创建一个返回不透明类型的自定义函数,如this answer中所述。尝试这样的事情:

struct ContentView: View {
    @State var colorScheme = ColorScheme.dark

    var body: some View {
        GeometryReader { geometry in
            Button("Create Account", action: {
                //DO SOME ACTION
            })
            .buttonStyle(for: colorScheme, geometry: geometry) /// use custom buttonStyle function
        }
    }
}

extension Button {
    @ViewBuilder
    func buttonStyle(for colorScheme: ColorScheme, geometry: GeometryProxy) -> some View {
        switch colorScheme {
        case .light:
            buttonStyle(CinderDarkButtonStyle(geometry: geometry))
        case .dark:
            buttonStyle(CinderLightButtonStyle(geometry: geometry))
        }
    }
}

buttonStyle(CinderDarkButtonStyle(geometry: geometry))上面在 a和修饰符之间切换buttonStyle(CinderLightButtonStyle(geometry: geometry)),基于colorScheme.


推荐阅读