Hi Jordan,

Thanks for the advice.

What if a subclass does implement hashValue differently? It seems you are 
saying a subclass should never override hashValue? Should Set not compare 
elements with == instead of hashValue?

Thanks
Nick

M: +44 (0)7986 048 141
W: http://nickbrook.me <http://nickbrook.me/>
> On 1 Sep 2016, at 23:55, Jordan Rose <jordan_r...@apple.com> wrote:
> 
>> 
>> On Sep 1, 2016, at 15:44, Zhao Xin via swift-users <swift-users@swift.org 
>> <mailto: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

Reply via email to