如果变量不是 nil,如何在 swift UI 中显示文本视图?

Posted

技术标签:

【中文标题】如果变量不是 nil,如何在 swift UI 中显示文本视图?【英文标题】:How to display a text view in swift UI if the variable isn't nil? 【发布时间】:2020-05-08 15:41:20 【问题描述】:

这基本上是我的代码:

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 不为零时到达该代码)有没有办法让这段代码更干净?

【问题讨论】:

【参考方案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 视图构建器

以上是关于如果变量不是 nil,如何在 swift UI 中显示文本视图?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 检查弱变量是不是为 nil 或不是线程安全的?

Swift:当变量不是可选时,处理意外的 nil 值

Swift:尝试测试 ObservedObject 变量是不是为 nil 时的 EXC_BREAKPOINT

Swift之Optional 可选值

Swift:检查变量是不是为零

发现可选值错误 nil swift 3