[swift-evolution] [Proposal] Explicit Synthetic Behaviour

Itai Ferber iferber at apple.com
Thu Sep 7 12:52:39 CDT 2017

I think there is a bit of confusion here as to what code synthesis does 
— synthesized conformances (whether `Equatable`, `Hashable`, or 
`Codable`) merely provide default implementations for something which 
_already_ conforms to one of these protocols; they do not _add_ 
conformance to types on your behalf.

struct X {
     let val: Int

under synthesized `Equatable` does _not_ get an `==` defined for it in 
the same way that it does not get `encode(to:)` or `init(from:)`. Since 
it does not conform to the `Equatable` (or `Codable`) protocol, no 
synthesis happens for it.

As opposed to

struct Y : Equatable {
     let val: Int

which would get a default implementation for `static func ==(…)`, 
which it would otherwise already have to implement, by definition.

Synthesis does not add methods on your behalf; it only gives 
implementations for methods you’d have to implement, no matter what. I 
don’t know what’s going on in your case, but it’s not caused by 
synthesis — if your type conforms to `Equatable`, either you would 
have to define `==` yourself, or you’d get a free one. You’d see 
ambiguity regardless, since you asked for the type to be `Equatable` (or 
inherited that requirement).

On 7 Sep 2017, at 10:32, Gwendal Roué via swift-evolution wrote:

> > Le 7 sept. 2017 à 14:37, Matthew Johnson <matthew at anandabits.com> a 
> écrit :
>> I don't understand what this has to do with synthesized Equatable.  
>> Wouldn't manually implemented Equatable have the same impact?  The 
>> design of a DSL should be able to accommodate conformance to basic 
>> protocols without ambiguity.
> I'll explain you:
> The problem with synthesized Equatable is that it adds an unwanted == 
> operator that returns a Bool.
> This operator is unwanted because it conflicts with the == operator 
> defined by the DSL which does not return a Bool.
> 	// Without synthesised Equatable
> 	let r = (a == b) // the type defined by the DSL
> 	// With synthesised Equatable
> 	let r = (a == b) // ambiguous
> This is the same kind of conflict that happen when a function is 
> overloaded with two return types:
> 	func f() -> Int { ... }
> 	func f() -> String { ... }
> 	f() // ambiguous
> Without the synthesized Equatable, the type would not have any == 
> operator that returns a Bool, and thus no conflict with the == 
> operator defined by the DSL (the one that returns an SQL expression, 
> in our particular context).
> I hope that I have explained how synthesized conformance may impact 
> code by the mere fact that they define methods. I'm not talking about 
> the correctness of the synthesized code. I'm talking about its mere 
> existence.
>> We generally want as many types to be Equatable and Hashable as 
>> possible.  Synthesized conformance means more types will have these 
>> conformance and that's a good thing in all cases (so long as the 
>> implementation is correct).
> Sure, of course. I'm with you. I'm not talking against code synthesis. 
> Again, I'm not talking about the correctness either.
> I'm talking about the consequences of implicit and non-avoidable 
> synthesis. Exactly the theme of this thread, unless I'm totally 
> mistaken.
> Gwendal Roué

> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170907/606f05ea/attachment.html>

More information about the swift-evolution mailing list