[swift-users] Set with element of NSObject subclasses didn't work as expected
Zhao Xin
owenzx at gmail.com
Tue Mar 28 14:50:40 CDT 2017
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170329/5befd66f/attachment.html>
More information about the swift-users
mailing list