在视图中,我有一个 switch 语句,其中每个案例都是一个视图,沿着这些思路:
Color.clear
.overlay {
switch x {
case let .text(text):
vis.textToImage()
.resizable().scaledToFill().tag(vis)
case .image:
vis.imageAsImageView()
.resizable().scaledToFill().tag(vis)
default:
Image(systemName: "x.circle")
.resizable().scaledToFill().tag(vis)
}
}
所以我想将“.ressized().scaledToFill().tag(vis)”移动到switch语句中,如下所示:
Color.clear
.overlay {
switch x {
case .text:
vis.textToImage()
case .image:
vis.imageAsImageView()
default:
Image(systemName: "x.circle")
}
.resizable().scaledToFill().tag(vis)
}
但是随后我收到编译器错误:
Type '() -> ()' cannot conform to 'ShapeStyle'
。
我做错了什么? switch 语句不会“返回”任何“case”吗?第一个代码示例似乎很简单(正在运行)?
在其原始形式中,switch 语句的执行方式为
ViewBuilder
。
如果您只需要
switch
返回 View
那么您可以将重构的 switch 语句包装为 Group
并且它会起作用。这会给你一个嵌套的ViewBuilder
。
但是,修饰符
.resizable()
不适用于 View
。因此交换机需要返回 Image
。
您可以做的是将开关移至返回
Image
的计算属性。比如:
private var imageForX: Image {
switch x {
case .text:
vis.textToImage()
case .image:
vis.imageAsImageView()
default:
Image(systemName: "x.circle")
}
}
Color.clear
.overlay {
imageForX
.resizable()
.scaledToFill()
.tag(vis)
}
通常,当您想要将视图修改器添加到可由
if
/switch
生成的所有视图时,您可以用 if
包围 switch
/Group
。
Group {
if someCondition {
View1()
} else {
View2()
}
}
// these modifiers will be applied to View1 if someCondition is true, and View2 otherwise
.fooModifier()
.barModifier()
resizable
仅适用于Image
,所以这在这里不起作用。
因为
resizable
仅在Image
上可用,这意味着switch
的每个分支都会产生一个Image
(否则就没有意义),所以你可以直接分配整个switch
到本地 let
,并在其上添加修饰符。
let image = switch x {
case .text:
vis.textToImage()
case .image:
vis.imageAsImageView()
default:
Image(systemName: "x.circle")
}
image.resizable().scaledToFill().tag(vis)