Presumably a DefaultValueHashable protocol with default implementation of Hashable and Equatable for value types and similarly <font size="2"><span style="background-color:rgba(255,255,255,0)">DefaultObjectHashable for objects could be provided in the standard library (using some deep integration into the compiler or a to be added reflection ability). Then it would be easy to opt in. </span></font><br><br>On Thursday, 10 March 2016, Sean Heber via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">&gt; We can also allow opt-in by adopting a protocol, eg `struct SimpleStruct: DefaultEquatable`. DefaultEquatable would tell the compiler to auto-generate an equatable implementation. Similar for DefaultHashable.<br>
&gt;<br>
&gt; In the C# world you’d actually do something like this with an attribute. I know user-defined attributes aren’t on the table right now but some more built-in ones would be sufficient: @defaultEquatable, @defaultHashable, etc.<br>
&gt; They could even take a list of properties to ignore if such a feature were useful: `@defaultEquatable(ignored: [currentDate, randomInt])`.<br>
<br>
Might be interesting if you could pass in parameters when you declare conformance, like:<br>
<br>
struct MyType : Equatable(default) {}<br>
<br>
If “default” was missing, you’d have to supply the relevant ==/equals function or whatever as usual, but if it was there you’d get automatically generated stuff based on documented rules.<br>
<br>
Maybe it could even be extensible so you can define protocol extensions that are “named” and only apply if you declare conformance with the relevant name:<br>
<br>
protocol Bar {<br>
  func barFunction()<br>
}<br>
<br>
extension Bar(foo) {<br>
  func fooFunction() { }<br>
}<br>
<br>
struct Type1 : Bar(foo) {<br>
  func barFunction() {}<br>
}<br>
<br>
struct Type2 : Bar {<br>
  func barFunction() {}<br>
}<br>
<br>
A Type1 instance would also have a fooFunction(), but a Type2 instance would not.<br>
<br>
Using this you could have multiple default implementations defined for the same protocol depending on circumstances.<br>
<br>
extension Bar(scenerio1) {<br>
  func barFunction() { print(“1”) }<br>
}<br>
<br>
extension Bar(scenerio2) {<br>
  func barFunction() { print(“2&quot;) }<br>
}<br>
<br>
struct Thing1 : Bar(scenerio1) {}<br>
struct Thing2 : Bar(scenerio2) {}<br>
<br>
let a: Bar = Thing1()<br>
let b: Bar = Thing2()<br>
<br>
a.barFunction() -&gt; “1”<br>
b.barFunction() -&gt; “2”<br>
<br>
:)<br>
<br>
l8r<br>
Sean<br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote><br><br>-- <br>-- Howard.<br>