Skip to content

Commit d76967d

Browse files
committed
Add AnyHashable support for Foundation.Decimal
Add a custom AnyHashable representation to Foundation.Decimal, so that it behaves like all other bridged types.
1 parent c8c41b3 commit d76967d

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

stdlib/public/SDK/Foundation/Foundation.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,9 @@ extension NSNumber : _HasCustomAnyHashableRepresentation {
433433
guard let kind = _SwiftTypePreservingNSNumberTag(
434434
rawValue: Int(_swift_Foundation_TypePreservingNSNumberGetKind(self))
435435
) else {
436+
if let nsDecimalNumber: NSDecimalNumber = self as? NSDecimalNumber {
437+
return AnyHashable(nsDecimalNumber as Decimal)
438+
}
436439
return nil
437440
}
438441
switch kind {

stdlib/public/SDK/Foundation/TypePreservingNSNumber.mm

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ @interface _SwiftTypePreservingNSNumber : NSNumber
3030
SwiftDouble = 4,
3131
SwiftCGFloat = 5,
3232
SwiftBool = 6
33-
// FIXME(id-as-any): add support for NSDecimal and
34-
// Foundation.Decimal.
3533
};
3634

3735
@implementation _SwiftTypePreservingNSNumber {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// RUN: %target-run-simple-swiftgyb
2+
// REQUIRES: executable_test
3+
// REQUIRES: objc_interop
4+
5+
import Foundation
6+
import StdlibUnittest
7+
8+
let NSDecimalNumberTests = TestSuite("NSDecimalNumber")
9+
10+
NSDecimalNumberTests.test("AnyHashable containing Foundation.Decimal") {
11+
let values = [
12+
NSDecimalNumber(string: "10.0"),
13+
NSDecimalNumber(string: "20.0"),
14+
NSDecimalNumber(string: "20.0"),
15+
]
16+
let anyHashables = values.map(AnyHashable.init)
17+
expectEqual("Decimal", String(anyHashables[0].base.dynamicType))
18+
expectEqual("Decimal", String(anyHashables[1].base.dynamicType))
19+
expectEqual("Decimal", String(anyHashables[2].base.dynamicType))
20+
expectNotEqual(anyHashables[0], anyHashables[1])
21+
expectEqual(anyHashables[1], anyHashables[2])
22+
}
23+
24+
runAllTests()
25+

0 commit comments

Comments
 (0)