<div dir="ltr"><div><div class="gmail_signature" data-smartmail="gmail_signature">I am probably misunderstanding you, but it seems to work for me:</div></div><div class="gmail_signature" data-smartmail="gmail_signature"><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px">class A: Hashable, CustomStringConvertible {<br>    var hashValue: Int { return ObjectIdentifier(self).hashValue }<br>    var description: String { return &quot;A@\(hashValue)&quot; }<br>}<br>func ==(lhs: A, rhs: A) -&gt; Bool {<br>    return lhs.hashValue == rhs.hashValue<br>}<br>class B: A {<br>    override var description: String { return &quot;B@\(hashValue)&quot; }<br>}<br><br>let ca = A() // Common A to be removed<br>let ra = A() // Retained A<br>let cb = B() // Common B to be removed<br>let rb = B() // Retained B<br>let aa: Set&lt;A&gt; = [ca, ra] // Have spelt out the type of aa, but compiler will infer correctly<br>let ab: Set&lt;A&gt; = [ca, cb] // Have spelt out the type of ab, but compiler will infer correctly<br>let a = aa.subtracting(ab)<br>a.contains(ca) // false<br>a.contains(ra) // true<br><br>let bb: Set&lt;A&gt; = [cb, rb] // Have to spell out the type of bb, compiler will infer Set&lt;B&gt;<br>let b = bb.subtracting(ab)<br>b.contains(cb) // false<br>b.contains(rb) // true</blockquote></div>