Hi,
It might be something very simple that I'm missing here, but trying to get my heads around the different behavior that I'm seeing in the following code samples:
// Example 1
func foo() {
struct Foo: Equatable, Hashable, CustomStringConvertible {
var a: Int
var b: Int = 0
static func ==(lhs: Foo, rhs: Foo) -> Bool {
lhs.a == rhs.a
}
func hash(into hasher: inout Hasher) {
hasher.combine(a)
}
var description: String {
"a: \(a), b: \(b)"
}
}
var foos: Set<Foo> = [
Foo(a: 1, b: 1),
Foo(a: 2, b: 1),
Foo(a: 3),
]
var insertedVal = foos.insert(Foo(a: 1)).memberAfterInsert
insertedVal.b += 1
foos.update(with: insertedVal)
foos // {{a 1, b 1}, {a 2, b 1}, {a 1, b 0}, {a 3, b 0}}
}
foo()
// Example 2
struct Foo: Equatable, Hashable, CustomStringConvertible {
var a: Int
var b: Int = 0
static func ==(lhs: Foo, rhs: Foo) -> Bool {
lhs.a == rhs.a
}
func hash(into hasher: inout Hasher) {
hasher.combine(a)
}
var description: String {
"a: \(a), b: \(b)"
}
}
func foo2() {
var foos: Set<Foo> = [
Foo(a: 1, b: 1),
Foo(a: 2, b: 1),
Foo(a: 3),
]
var insertedVal = foos.insert(Foo(a: 1)).memberAfterInsert
insertedVal.b += 1
foos.update(with: insertedVal)
foos // {{a 3, b 0}, {a 1, b 2}, {a 2, b 1}}
}
foo2()
In the former, the compiler is using the synthesized equatable implementation and never calls the implementation defined in the nested Foo. However, in the latter, it's using the given implementation.
I'm trying to see if it's a compiler bug or something that I'm missing here.
Appreciate your help.