There are a few issues that need to be resolved: simply removing the UI widget from its superview doesn't nullify it, so any observers it has on the presentation model are still active and, of course, it's still loitering around in memory wasting precious resources.It takes a little additional work to be able to do this...

nodeWidget.removeFromSuperview()
nodeWidget = nil

...
the first step being to make my
NodeWidget class implement
NilLiteralConvertible. Implementing this protocol means that my class has to have a
convertFromNilLiteral() method that returns a nulled version of itself. My version looks like this
: [See addendum below]

I've also used UIView.animateWithDuration to make the deleted node fade out rather than suddenly vanish. This requires a temporary variable, nodeWidgetPendingDelete, that holds a reference to the deleted widget which is removed from its superview and nulled once the fade is completed:

...and there we go: now the node isn't just removed from the view and hidden from the user, it's properly deinitialised and all its observers removed.Of course, the related value object needs to be removed and any references to it in the inputs array of the other nodes need to be removed too. This is done in the presentation model using filters on the arrays:

My source code is now updated and available at my GitHub repository here.Addendum Thanks to @ChromophoreApp for pointing out that the NilLiteralConvertable implementation is an unnecessary step. My first cut of the code accidentally had the reference to the deleted NodeWidget non-optional (i.e. no ?) which is why I couldn't set it to nil - a schoolboy error! Now that nodeWidgetPendingDelete is optional, I can set it to nil without jumping through hoops!