A quick ping. I'd like some feedback about how to address this problem. -Joe
> On Nov 2, 2016, at 10:26 AM, Joe Groff via swift-dev <swift-dev@swift.org> > wrote: > > There's a hole in our AnyHashable implementation when it comes to what I'll > call "pure" NSNumbers coming from Cocoa, which were instantiated using > -[NSNumber numberWith*:] factories or @(n) syntax in Objective-C. While we > maintain type specificity when Swift number types are bridged through > NSNumber, NSNumbers constructed in ObjC do not necessarily remember the type > they were constructed with or expect to be strictly used as only that type, > so we resign to being "fuzzy" and let them bridge back to any Swift type. We > however fail to bring this fuzziness to AnyHashable. When we construct an > AnyHashable, we'll bring bridged NSNumbers back to their original Swift > types, but we leave a pure NSNumber as an NSNumber, so it doesn't hash or > equate with numeric values in Swift: > > // ObjC > @import Foundation; > > NSDictionary *foo() { > return @{@(1): @"one"}; > } > > // Swift > let theFoo /*: [AnyHashable: Any]*/ = foo() > theFoo[1] // returns nil, ought to find the value "one" > > One way to address this would be to make Swift's number types use the same > hashing as NSNumber does. We could go so far as to switch the "custom > AnyHashable" polarity around and coerce the Swift number types into NSNumbers > when we put them inside AnyHashable, which would give us consistent hashing > and fuzzy equality, but would come at a performance cost when converting a > number to AnyHashable. We would also lose type specificity in equality for > Swift values, since NSNumber's -isEqual: only compares numeric value, unless > we special-cased NSNumber in AnyHashable's implementation. > > If we didn't want to adopt NSNumber's hashing for Swift's types, but we were > willing to say that all of Swift's number types produce the same hashValue > for the same numeric value (so 12.hashValue == 12.0.hashValue == (12 as > UInt8).hashValue, etc.), we could also go the other direction, and customize > a pure NSNumber's AnyHashable implementation to use Swift's number hashing. > We would still need special handling for equality of a pure NSNumber with > Swift numbers, but maybe that's inevitable. > > -Joe > _______________________________________________ > swift-dev mailing list > swift-dev@swift.org > https://lists.swift.org/mailman/listinfo/swift-dev _______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev