<div dir="ltr">Since Array has .elementsEqual, another workaround (until conditional conformance) is:<div><br></div><div><div>class Tree : Equatable {</div><div>    let rootData:Int</div><div>    let children:[(String, Tree)]</div><div>    </div><div>    init(rootData: Int, children: [(String, Tree)]) {</div><div>        self.rootData = rootData</div><div>        self.children = children</div><div>    }</div><div>    static public func ==(_ lhs:Tree, _ rhs:Tree) -&gt; Bool {</div><div>        return lhs.rootData == rhs.rootData &amp;&amp;</div><div>            lhs.children.elementsEqual(rhs.children, by: { (a: (String, Tree), b: (String, Tree)) -&gt; Bool in</div><div>                return a.0 == b.0 &amp;&amp; a.1 == b.1</div><div>            })</div><div>    }</div><div>}</div></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jul 9, 2017 at 8:44 PM, David Sweeris <span dir="ltr">&lt;<a href="mailto:davesweeris@mac.com" target="_blank">davesweeris@mac.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><span class=""><div><br></div><div>On Jul 9, 2017, at 10:06, David Baraff via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><br><div><blockquote type="cite"><div>On Jul 9, 2017, at 8:27 AM, Jens Persson &lt;<a href="mailto:jens@bitcycle.com" target="_blank">jens@bitcycle.com</a>&gt; wrote:</div><br class="m_-7025976968143332599Apple-interchange-newline"><div><div dir="ltr">(Also, note that your implementation of == uses lhs === rhs thus will only return true when lhs and rhs are the same instance of SomeClass.)</div></div></blockquote><div>Of course — i threw that in just to make a simple example.</div><div><br></div><div>Followup question: what I really wanted to write was an == operator for a tree:</div><div><br></div><div>// silly tree, useful for nothing</div><div>class Tree : Equatable {</div><div>   let rootData:Int</div><div>   let children:[(String, Tree)]</div><div><br></div><div>   static public func ==(_ lhs:Tree, _ rhs:Tree) {</div><div><span class="m_-7025976968143332599Apple-tab-span" style="white-space:pre-wrap">        </span>return lhs.rootData == rhs.rootData &amp;&amp; </div><div>            lhs.children == rhs.children<span class="m_-7025976968143332599Apple-tab-span" style="white-space:pre-wrap">                </span>// sadly, this doesn’t compile</div><div>   }</div><div>}</div></div></blockquote><br></span><div>Right, the `==` func is *defined* for 2-element tuples where both elements conform to `Equatable`, but that tuple type doesn&#39;t itself *conform* to `Equatable`. So the<span style="background-color:rgba(255,255,255,0)">`==` func that&#39;s defined on &quot;Array where Element: Equatable&quot; can&#39;t see it.</span></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div><div><span style="background-color:rgba(255,255,255,0)">We&#39;d need both &quot;conditional conformance&quot; and &quot;tuple conformance&quot; in order for that to Just Work.</span></div><div><span style="background-color:rgba(255,255,255,0)"><br></span></div><div><span style="background-color:rgba(255,255,255,0)">- Dave Sweeris </span></div></div></blockquote></div><br></div>