如何在 SwiftUI 中的三元运算符中“不执行任何操作”?

rit*_*lee 4 swift swiftui

这是我的代码:

struct GameView : View {
    @State
    private var clicked1 : Bool = false
    
    var body: some View {
        HStack {
            VStack {
                Image("shape0")
                    .overlay(clicked1 ?
                        RoundedRectangle(cornerRadius:10)
                        .stroke(Color.yellow, lineWidth: 7) : pass()
                    )
                    .onTapGesure {
                        print("Image is clicked")
                    }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但周围发生了一些错误pass()

clicked1当变量为 时我不想做任何事情false

我该如何修复它?

New*_*Dev 6

.overlay需要一些视图类型作为参数。

如果要使用三元运算符,它必须返回相同的类型。对于“不执行任何操作”视图,请使用EmptyView(),但由于它必须是相同的类型,因此一种方法是将每个条件视图包装为AnyView

Image("shape0")
   .overlay(clicked1
            ? AnyView(RoundedRectangle(cornerRadius:10)
                         .stroke(Color.yellow, lineWidth: 7))
            : AnyView(EmptyView())
           )
Run Code Online (Sandbox Code Playgroud)

编辑: 实际上 -Optional<Wrapped: View>也符合View,所以这是比上面更好的方法 - 即只需返回您想要的视图或nil

Image("shape0")
   .overlay(clicked1 ? RoundedRectangle(cornerRadius:10)
                         .stroke(Color.yellow, lineWidth: 7) : nil)
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用返回条件视图的计算属性:

var body: some View {
   Image("shape0")
      .overlay(overlayView)
}

@ViewBuilder
var overlayView: some View {
    if clicked1 {
        RoundedRectangle(cornerRadius:10)
                         .stroke(Color.yellow, lineWidth: 7)
    }
}
Run Code Online (Sandbox Code Playgroud)