How to display a text view in swift UI if the variable isn't nil?

偶尔善良 提交于 2021-02-10 14:42:32

问题


This is basically my code I have:

var myString: String?

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

If I try without adding the ?? "" part, it doesn't work, says Value of optional type 'String?' must be unwrapped to a value of type 'String'. If I add it in as shown above, it seems to work, but why do I need to have a default empty string value if that's never going to be the case? (Since it will only reach that code if myString is not nil) Is there a way I can make this code more cleaner?


回答1:


You need to use optional binding to unwrap the safely optional variable. However simply using that inside body will result in a compiler error because not all control flow (including if let) is allowed inside the body of the view, so you'll need to wrap it in another computed property.

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

Or you can simplify that using 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)
}

This is one of the ways to safely unwrap an optional, but as it was pointed out it won't work inside a view builder block. Instead you can use map to keep it simple.

var myString: String?

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


来源:https://stackoverflow.com/questions/61682797/how-to-display-a-text-view-in-swift-ui-if-the-variable-isnt-nil

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!