switch 语句“返回”视图?

问题描述 投票:0回答:2

在视图中,我有一个 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”吗?第一个代码示例似乎很简单(正在运行)?

swiftui
2个回答
0
投票

在其原始形式中,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)
    }

0
投票

通常,当您想要将视图修改器添加到可由

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)
© www.soinside.com 2019 - 2024. All rights reserved.