[swift-evolution] Derived Equatable conformance akin to Codable

Logan Shire logan.shire at gmail.com
Fri May 26 02:10:24 CDT 2017

Given we now have precedent in the form of the derived Codable conformance coming in Swift 4.0,
it begs the question why we don’t offer the same behavior for value types that declare themselves to be Equatable
and have all Equatable properties. E.g.

struct A: Equatable {
  let foo: String
  let bar: Int

struct B: Equatable {
  let baz: Double

struct C: Equatable {
  let a: A
  let b: B

let a = A(foo: “hello”, bar: 1)
let a2 = A(foo: “hello”, bar: 2)
a == a2 // false
let b = B(baz: 3.1)
let c = C(a: a, b: b)
le c2 = C(a: a2, b: b)
c == c2 // false

You would always be free to shadow the provided implementation:

extension A {
  func ==(lhs: A, rhs: A) {
    return lhs.foo == rhs.foo

a == a2 // true

It’s up for debate whether this should apply to reference types, or Hashable, but at a bare minimum we should
offer it for value types consisting of Equatable value types that explicitly declare but don’t implement the conformance.


More information about the swift-evolution mailing list