edit: regarding the last question, sorry in my testing View was still Equatable. Once I removed that, the object's == was called and if I had 2 objects and switched them but made the == make them look equal then body wasn't called. ContentView2(object: ((counter % 2 == 0) ? object1 : object2), x: counter2). This probably isn't too useful for ObservedObject but for standard objects that are designed to be immutable, like NSURL or NSManagedObjectID then I suppose this behaviour is useful.