Classes are a bit different. If you have a variable (let or var) referring to a class instance, the variable actually contains a reference to the instance (basically, a pointer to the instance's memory, which is elsewhere).
As before, a let variable is read-only, so you cannot assign a different reference to it, and a var variable is read-write, so you can assign a different reference to it. Note, though, that you are only changing the reference held in the variable. You are not changing anything in the instance to which the variable points.
Let's take an example context to make this clearer:
class C {
let v0: Int
var v1: Int
}
let c0 = C(v0: 0, v1: 1)
var c1 = C(v0: 2, v1: 3)
c1 = C(v0: 4, v1: 5)
You can't change c0, of course. It's read-only, so it always points to just that first instance of `C.
You can change c1. Above, it initially points to one instance, then later points to another.
Note that we created a total of 3 instances of C, but we didn't change any of them. We only changed a variable containing references to them.
Given the above, we can do this:
c0.v1 = 44
c1.v1 = 66
Both of those work, because we're allowed to invoke mutable behavior on any class instance regardless of the variable that holds the reference to the instance (i.e. both c0 and c1 work).
That's because the instance isn't in the variable, only a reference to the instance. That's what it is to be a "reference type".
You might wonder how you could make an instance immutable. The answer is that you can't, if it has any mutable behaviors (like the property v1). The nearest you can get is to split the class into two classes, an immutable one (i.e. a class with no mutable behaviors) and an immutable subclass. (Now we've gone round the circle to meet the question that started this thread.)
This inability to control the mutability of class instances directly is one major reason why classes are are regarded as treacherous in Swift, and generally discouraged when a choice between class and struct is feasible.
In Obj-C, for comparison, where all the interesting things like arrays are classes, you have to be very aware of which classes are immutable, which ones have mutable subclasses, and which ones are just mutable without having an immutable superclass. Yes, this is a big cause of bugs in Obj-C, at least for the unwary.