我有以下代码:
@State var type: String = "color"
@State var color: Color = Color(.black)
@State var gradient: LinearGradient = LinearGradient(colors: [.orange, .red],
startPoint: .top,
endPoint: .center)
Text("Hello World!").foregroundStyle(type == "color" ? color : gradient)
它抱怨颜色和渐变不是同一类型。但是,修饰符没有条件逻辑。那么,怎样才能达到预期的效果呢?
注意:我有大约 14 个其他修饰符,因此包装 if else 不起作用,因为其他一些修饰符也有同样的问题,因此会有太多的 if else 组合。
.foregroundStyle
接受类型为 ShapeStyle
的参数。因此,您必须创建自己的 ShapeStyle
实现。然而,ShapeStyle
协议以及大多数 SwiftUI 都被 Apple 隐藏,因此尝试实现自己的 ShapeStyle
很棘手(并且可能存在问题)。
话虽如此,您可以按照
此处的步骤创建自己的
ShapeStyle
,从而实现您想要完成的任务。 (归功于this答案)。只需将不同的情况放入 ShapeStyle
对象中并相应地设置样式即可。
您应该诚实地使用 if/else 语句,如果您担心可读性,请将其放入函数中。
您可以将 ShapeStyle 泛型采用到您的视图模式中。例如:
struct MyView<Style: ShapeStyle>: View {
let style: Style
var body: some View {
Rectangle().foregroundStyle(style)
}
}
将
Colour
和 LinearGradient
包裹在 AnyShapeStyle
中以实现类型擦除:
@State var type: String = "color"
@State var color: Color = Color(.black)
@State var gradient: LinearGradient = LinearGradient(colors: [.orange, .red],
startPoint: .top,
endPoint: .center)
Text("Hello World!")
.foregroundStyle(type == "color"
? AnyShapeStyle(color) : AnyShapeStyle(gradient))