>>Because in this case the lazy property will is assigned a value again when the lazy property is first referenced, This will make the property mutable so that it will not allow lazy constant in Swift.
Yes, exactly so.
But, initialization != initial value
It's a matter of terminology. Swift has a process called "initialization", which applies when an instance of a type is created. As part of initialization, the instance's properties are also initialized, and Swift has a rule that all properties must be initialized at the beginning of the instance initialization. This is true of Quinn's "Foo" example. All properties (including the lazy ones) are regarded as initialized during Foo's initializer.
However, all stored properties also start out with an initial value, which is something different. Lazy properties have an (unspecified) initial value, simply because they occupy memory, and the memory must contain something. It could be zero, or it could be garbage, it doesn't really matter because we will never find out what that value is — because as soon as we try, the lazy initialization will change the value to the correct thing.
So, a better mental picture for "lazy" properties would be that they are invisibly set to (say) zero bits during instance initialization, and re-set to a different value later. That's why they cannot be 'let'.
Or, it may help to think that initialization is a compile-time concept, while initial value is a run-time concept.