Taking self by value, like self or mut self moves ownership and stops you being able to access it any more. If you want to mutate without losing control, a mutable reference like &mut self is required, and then you'll need to be careful about how the swap is performed. The easiest and best way is via std::mem::swap (that and replace are extremely useful functions).
Since the function is swap(mut self) doesn't that mean after the first call to swap() that the object is destroyed? It's basically passing "x" into swap swap() and swap doesn't return it, therefor swap must destroy it?
You are passing in the object, instead of a reference to the object. Which means you passed ownership of the object into the swap() method. Since the function is not returning the object, the object is "lost" when the function returns. When you pass in the mutable reference the function is just borrowing the object, and so it still exists once the function returns.