Given an array of instances of a `Hashable` value type, all equal according to `Equatable` protocol, but with distinct `hashValue`s, I would expect that initialising a set with that array would preserve all the instances. Instead, running the code below in an iOS playground on Xcode 8.0 (8A218a), results in a behaviour that I cannot explain. If anyone can, I’d be very grateful!

    struct X: Hashable {
        let x: Int
        let hashValue: Int

        static func == (lhs: X, rhs: X) -> Bool {
            return lhs.x == rhs.x
        }
    }

let array: [X] = (1...100).map{ X(x: 7, hashValue: $0) } // unique hash values
    array.count //→ 100

    let set = Set(array)
    set.count //→ 43

    let set2 = Set(Array(set))
    set2.count //→ 30

    let set3 = Set(Array(set2))
    set3.count //→ 30

    set3.sorted{ $0.hashValue < $1.hashValue }
.forEach{ print(String($0.hashValue, radix: 2), "=", $0.hashValue) } /*→
           1 = 1
          11 = 3
         101 = 5
        1111 = 15
       10010 = 18
       10011 = 19
       11000 = 24
       11101 = 29
       11111 = 31
      100000 = 32
      100011 = 35
      100100 = 36
      100110 = 38
      101000 = 40
      101001 = 41
      101011 = 43
      101111 = 47
      110010 = 50
      110101 = 53
      111101 = 61
     1000010 = 66
     1001011 = 75
     1001101 = 77
     1001111 = 79
     1010000 = 80
     1011001 = 89
     1011100 = 92
     1011110 = 94
     1011111 = 95
     1100010 = 98
    */

Many thanks,

milos

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to