6

I have a ObservableObject class called MyObjectModel that is passed to a struct like this:

var body: some View {
  MyView(myObjectModel)

But on another context I do not have a model to pass, so I want to call MyView simply as

var body: some View {
  MyView()

So I thought I could initialize MyView like

struct MyView: View {

  @ObservedObject private var model: MyObjectModel?

  init(model: MyObjectModel? = nil) {
    self.model = model
  }

But Xcode will not let me use @ObservedObject on an optional.

How do I do that?

Duck
  • 34,902
  • 47
  • 248
  • 470

1 Answers1

8

The ObservedObject wrapper does not have constructor with optional for now (and we cannot extend Optional with conformance to ObservableObject, because it is not a class).

A possible approach is to have some specific mark that there is no model, as it would be nil.

Here is a demo:

class MyObjectModel: ObservableObject {
    static let None = MyObjectModel()     // Like NSNull.null
}

struct MyView: View {

    @ObservedObject private var model: MyObjectModel

    init(model: MyObjectModel? = nil) {
        self.model = model ?? MyObjectModel.None
    }

    var body: some View {
        if self.model === MyObjectModel.None {
            Text("Same as it would be nil!")      // << here !!
        } else {
            Text("For real model")
        }
    }
}
Asperi
  • 228,894
  • 20
  • 464
  • 690