Why does Swift allow assigning a struct property to itself, but not a class property?

Viewed 107

Swift has this awesome error that shows up when you try to do something of the form x = x:

class Foo {
    var foo = 1
}

var a = Foo()
a.foo = a.foo // error

This helped me avoid typos where the class had two similarly named properties, and I want to assign one to the other, but mistakenly typed the same one twice.

However, in this particular case:

struct Foo {
    var foo = 1 {
        didSet {
            print("Did set")
        }
    }

    mutating func f() {
        foo = foo
    }
}

var a = Foo()
a.foo = a.foo

It successfully compiles! There isn't even an error on the foo = foo line! If I change Foo to a class, or if I remove the didSet, then the expected error appears. It's just this struct + didSet combination that makes the compiler think "yeah, a.foo = a.foo makes a lot of sense! Let me allow that!"

I found this related post, which is about how to stop getting this error, rather than how to get it.

I also looked on bugs.swift.org, but there were only 3 results, and none of them are related.

I'm using Swift 5.3.2 and Xcode 12.4.

Is there any reason why assigning a struct property to itself is more "OK" than assigning a class property to itself?

0 Answers
Related