[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