【问题标题】:How to "do nothing" in ternary operator in SwiftUI?如何在 SwiftUI 的三元运算符中“什么都不做”?
【发布时间】:2021-02-26 01:44:35
【问题描述】:

这是我的代码:

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")
                    }
            }
        }
    }
}

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

当变量clicked1false 时,我什么都不想做。

我该如何解决?

【问题讨论】:

标签: swift swiftui


【解决方案1】:

.overlay 需要某种视图类型作为参数。

如果你想使用三元运算符,它必须返回相同的类型。对于“什么都不做”视图,请使用 EmptyView(),但由于它必须是相同的类型,因此一种方法是使用 AnyView 包装每个条件视图:

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

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

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

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

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

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

【讨论】:

  • 你忘了括号 - AnyView(EmptyView())
  • 感谢 Optional 符合 View 部分。现在说得通了!
【解决方案2】:

这也可以,诀窍是使用Group

使用三元:

Image("shape0")
   .overlay(
       Group {
           clicked1 ?
               RoundedRectangle(cornerRadius:10)
                   .stroke(Color.yellow, lineWidth: 7)
           : nil
       }
   )

使用如果:

Image("shape0")
   .overlay(
       Group {
           if clicked1 { 
               RoundedRectangle(cornerRadius:10)
                   .stroke(Color.yellow, lineWidth: 7)
           }
       }
   )

【讨论】:

  • 这提醒了我Optional<Wrapped: View> : View - 即可选视图是一个视图,所以不需要Group
猜你喜欢
  • 2015-08-31
  • 1970-01-01
  • 2021-10-17
  • 2017-04-30
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
相关资源
最近更新 更多