Skip to content

Commit 605218d

Browse files
authored
Merge pull request #4793 from DougGregor/custom-anyhashable-nsmeasurement
[Foundation overlay] Enable custom AnyHashable representation for NSMeasurement
2 parents ce31b5a + 8fc8a5e commit 605218d

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

stdlib/public/SDK/Foundation/Measurement.swift

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,6 @@ extension Measurement : _ObjectiveCBridgeable {
227227
}
228228
}
229229

230-
/*
231-
FIXME(id-as-any): can't write this code because of:
232-
<rdar://problem/27539951> "unhandled generic bridged type" when bridging NSMeasurement
233-
234230
@available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
235231
extension NSMeasurement : _HasCustomAnyHashableRepresentation {
236232
// Must be @nonobjc to avoid infinite recursion during bridging.
@@ -239,7 +235,6 @@ extension NSMeasurement : _HasCustomAnyHashableRepresentation {
239235
return AnyHashable(self as Measurement)
240236
}
241237
}
242-
*/
243238

244239
// This workaround is required for the time being, because Swift doesn't support covariance for Measurement (26607639)
245240
@available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)

test/stdlib/TestMeasurement.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,34 @@ class TestMeasurement : TestMeasurementSuper {
147147
expectTrue(fiveKM < sevenThousandM)
148148
expectTrue(fiveKM <= fiveThousandM)
149149
}
150+
151+
func test_AnyHashableContainingMeasurement() {
152+
let values: [Measurement<UnitLength>] = [
153+
Measurement(value: 100, unit: UnitLength.meters),
154+
Measurement(value: 100, unit: UnitLength.kilometers),
155+
Measurement(value: 100, unit: UnitLength.kilometers),
156+
]
157+
let anyHashables = values.map(AnyHashable.init)
158+
expectEqual(Measurement<UnitLength>.self, type(of: anyHashables[0].base))
159+
expectEqual(Measurement<UnitLength>.self, type(of: anyHashables[1].base))
160+
expectEqual(Measurement<UnitLength>.self, type(of: anyHashables[2].base))
161+
expectNotEqual(anyHashables[0], anyHashables[1])
162+
expectEqual(anyHashables[1], anyHashables[2])
163+
}
164+
165+
func test_AnyHashableCreatedFromNSMeasurement() {
166+
let values: [NSMeasurement] = [
167+
NSMeasurement(doubleValue: 100, unit: UnitLength.meters),
168+
NSMeasurement(doubleValue: 100, unit: UnitLength.kilometers),
169+
NSMeasurement(doubleValue: 100, unit: UnitLength.kilometers),
170+
]
171+
let anyHashables = values.map(AnyHashable.init)
172+
expectEqual(Measurement<Unit>.self, type(of: anyHashables[0].base))
173+
expectEqual(Measurement<Unit>.self, type(of: anyHashables[1].base))
174+
expectEqual(Measurement<Unit>.self, type(of: anyHashables[2].base))
175+
expectNotEqual(anyHashables[0], anyHashables[1])
176+
expectEqual(anyHashables[1], anyHashables[2])
177+
}
150178
}
151179

152180
#if !FOUNDATION_XCTEST
@@ -159,6 +187,8 @@ if #available(OSX 10.12, iOS 10.0, tvOS 10.0, watchOS 3.0, *) {
159187
MeasurementTests.test("testMeasurementFormatter") { TestMeasurement().testMeasurementFormatter() }
160188
MeasurementTests.test("testEquality") { TestMeasurement().testEquality() }
161189
MeasurementTests.test("testComparison") { TestMeasurement().testComparison() }
190+
MeasurementTests.test("test_AnyHashableContainingMeasurement") { TestMeasurement().test_AnyHashableContainingMeasurement() }
191+
MeasurementTests.test("test_AnyHashableCreatedFromNSMeasurement") { TestMeasurement().test_AnyHashableCreatedFromNSMeasurement() }
162192
runAllTests()
163193
}
164194
#endif

0 commit comments

Comments
 (0)