Mutating Function on Class Type (Possible bug?)

It's "correct" behavior because the default implementation is allowed to go self = someCompletelyDifferentObjectOfTheSameType, and that would reassign the reference at the call site. See SR-142 for some more discussion.

Even beyond this, mutating and classes don't play so well together. It may not be the best model for what you're trying to do.