swift - 在 SwiftUI 中使用三元运算符会导致类型不匹配错误,为什么?
问题描述
我目前一直在使用这个Environment
变量来调整我的应用程序的内容Dark
和Light
模式。
@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)
)
解决方案
除了@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
.
推荐阅读
- c++11 - 从不替换的离散分布中抽样,其中概率每次抽签都会改变
- javascript - 如何在自定义 TFS 小部件中更改饼图颜色
- ios - 如何在iOS中检测静音按钮事件被触发
- python - 基于数据框中的“从”和“到”列映射值
- python - PIL:使图像按百分比透明
- dojo - 在 dojo iframe 中获取文件上传错误 - doc.getElementsByTagName('textarea')[0].value undefined error
- html - 在左边缘放置一个垂直引导按钮
- python - 具有大类层次结构的继承
- tensorflow - tensorflow - tf.Session() 不创建新会话
- reason - 你如何在 ReasonReact 应用程序中使用环境变量?