One does not "simply" mark a method as mutating.
A) One must ensure that one's callers are also mutating, or otherwise have an assignable reference, all the way up the stack
B) One must mark the applicable function in the protocol interface as mutating, which may or may not be under your control
C) One must now repeat step A for all consumers of the protocol in step B, even if none of the other implementations of that protocol mutate their own state
Of course one can design one's architecture specifically with a view toward making ABC trivial, but in the general, unrestricted, default, I-had-other-problems-that-day-and-didn't-think-about-it case, they are hard.
That is why I find calls to "just learn value semantics" necessary but insufficient. Value semantics will not refactor my code when I discover-by-surprise that 18 functions need to become mutating, breaking API compatibility across several build targets, because I failed to forsee a necessary mutation 8 months ago.