4

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?

2 Answers 2

4

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) }
      }
    }
}
Sign up to request clarification or add additional context in comments.

Comments

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

3 Comments

And that results in a compiler error Closure containing control flow statement cannot be used with function builder 'ViewBuilder'. See How to have a dynamic list of views using SwiftUI.
@pizzae no, that piece of code inside your body doesn't compile
@pizzae I updated my answer to work with SwiftUI view builders

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.