> On Sep 1, 2016, at 15:44, Zhao Xin via swift-users <swift-users@swift.org> > wrote: > > Hi Nick, > > Glad to help. > > but when using third party classes I don’t know if the hash values are > comparable > > You can create an extension with a convenient init(:), which creates a new > instance of the super class basing on the instance of the sub class. That > will guarantee the subtraction. Below code works in Xcode 7.3.1 with Swift > 2.2. > > import Foundation > > func ==(lhs: Foo, rhs: Foo) -> Bool { > return lhs.id == rhs.id > } > > class Foo:Hashable { > let id:Int > var hashValue: Int { > return id > } > > required init(_ id:Int) { > self.id = id > } > } > > class Bar:Foo { > override var hashValue: Int { > return id * 5 > } > } > > var fooSet:Set<Foo> = [Foo(10), Foo(9), Foo(8), Foo(7)] > var barSet:Set<Bar> = [Bar(8), Bar(7), Bar(6), Bar(5)] > > //fooSet.subtract(barSet) // error: cannot invoke 'subtract' with an argument > list of type '(Set<Bar>)' > fooSet = fooSet.subtract(barSet as Set<Foo>) // works, but not what we want > fooSet.forEach { print("\($0.dynamicType), id:\($0.id)") } > /* > Foo, id:7 > Foo, id:10 > Foo, id:9 > */
This isn't really a sensible thing to do. The rules for Hashable require that `a == b` implies `a.hashValue == b.hashValue`, and `a.hashValue != b.hashValue` implies `a != b`. If you break these rules you're going to have problems no matter what static types you're using. Upcasting from Set<Bar> to Set<Foo> is the most concise way to solve this problem. Jordan
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users