【问题标题】:How to display a text view in swift UI if the variable isn't nil?如果变量不是 nil,如何在 swift UI 中显示文本视图?
【发布时间】:2023-03-24 02:32:01
【问题描述】:

这基本上是我的代码:

var myString: String?

var body: some View {
  NavigationView {
    if myString != nil {
      CustomView(text: myString ?? "")
    }
  }
}

如果我尝试不添加 ?? "" 部分,它不起作用,Value of optional type 'String?' must be unwrapped to a value of type 'String' 说。如果我如上所示添加它,它似乎可以工作,但是如果永远不会出现这种情况,为什么我需要一个默认的空字符串值? (因为它只会在 myString 不为零时到达该代码)有没有办法让这段代码更干净?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    您需要使用可选绑定来解开安全可选变量。然而,仅仅在body 内使用它会导致编译器错误,因为并非所有控制流(包括if let)都允许在视图的body 内使用,因此您需要将其包装在另一个计算属性中。

    struct MyView: View {
    
        var myString: String?
    
        var body: some View {
          NavigationView {
            innerView
          }
        }
    
        var innerView: some View {
            if let myString = myString {
                return AnyView(CustomView(text: myString))
            } else {
                return AnyView(EmptyView())
            }
        }
    }
    

    或者你可以使用Optional.map来简化它。

    struct MyView: View {
        var myString: String?
    
        var body: some View {
          NavigationView {
            myString.map { CustomView(text: $0) }
          }
        }
    }
    

    【讨论】:

      【解决方案2】:
      if let myString = myString {
        CustomView(text: myString)
      }
      

      这是安全地解开可选项的一种方法,但正如它所指出的那样,它在视图构建器块中不起作用。相反,您可以使用map 来保持简单。

      var myString: String?
      
      var body: some View {
        NavigationView {
          myString.map { CustomView(text: $0) }
        }
      }
      

      【讨论】:

      • 这会导致编译器错误Closure containing control flow statement cannot be used with function builder 'ViewBuilder'。见How to have a dynamic list of views using SwiftUI
      • @pizzae 不,body 中的那段代码无法编译
      • @pizzae 我更新了我的答案以使用 SwiftUI 视图构建器
      猜你喜欢
      • 2012-04-05
      • 2022-11-30
      • 2019-05-07
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      相关资源
      最近更新 更多