Please see the code first. import Foundation
class Foo:Hashable { let value:Int public var hashValue: Int { return value } public static func ==(lhs: Foo, rhs: Foo) -> Bool { return lhs.value == rhs.value } init(_ value:Int) { self.value = value } } let fooSetA:Set = [Foo(8), Foo(9)] let fooSetB:Set = [Foo(9), Foo(10)] let fooResultC = fooSetA.intersection(fooSetB) // {{value 9}} let fooResultD = fooSetA.subtracting(fooSetB) // {{value 8}} class Bar:NSObject { let value:Int override public var hashValue: Int { return value } public static func ==(lhs: Bar, rhs: Bar) -> Bool { return lhs.value == rhs.value } init(_ value:Int) { self.value = value } } let barSetA:Set = [Bar(8), Bar(9)] let barSetB:Set = [Bar(9), Bar(10)] let barResultC = barSetA.intersection(barSetB) // Set([]) let barResultD = barSetA.subtracting(barSetB) // {{NSObject, value 9}, {NSObject, value 8}} Behaviors of `func intersection(Set<Set.Element>)` and `func subtracting(Set<Set.Element>)` were different between normal Swift class and NSObject subclasses. I had thought they should be the same. It seemed that Set<NSObject> relied on addresses of NSObject instances instead of their hashValues. That made the Set useless. Swift version: 3.1 (swiftlang-802.0.48 clang-802.0.48) Xcode 8.3 (8E162) Zhaoxin
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users