How to observe optional ObservableObject in SwiftUI

Issue #988

When working with Core Data, there are times we have optional NSManagedObject to pass around. These objects conform to ObservableObject, and in SwiftUI we can’t @ObservedObject on optional ObservableObject

One way we can workaround this is to introduce a wrapper type that checks and internally observes the ObservableObject

struct ObserveView<T: ObservableObject, Content: View>: View {
    var object: T?
    @ViewBuilder var content: (T) -> Content
    
    struct InnerView: View {
        @ObservedObject var object: T
        var content: (T) -> Content
        
        var body: some View {
            content(object)
        }
    }
    
    var body: some View {
        if let object {
            InnerView(object: object, content: content)
        }
    }
}

@ViewBuilder
func observe<T: ObservableObject, Content: View>(_ object: T?, @ViewBuilder content: @escaping (T) -> Content) -> some View {
    ObserveView(object: object, content: content)
}

So we can use like

var book: Book?

observe(book) { book in
    Text(book.name)
}
Written by

I’m open source contributor, writer, speaker and product maker.

Start the conversation