Determine user’s “Temperature Unit” setting on iOS 10 (Celsius / Fahrenheit)

There is an (NS)MeasurementFormatter class. It inherits from an (NS)Formatter class. It’s a new class available for iOS 10+ SDK.

I am not sure whether it’s necessary to know, what unit a user has set in their preferences.

To set a Measurement using Swift 3:

let formatter = MeasurementFormatter()
let measurement = Measurement(value: 24.5, unit: UnitTemperature.celsius)
let temperature = formatter.string(from: measurement)
print(temperature) // 76.1°F 
// this value was computed to Fahrenheit value on my locale/preferences

For retrieval of a Measurement:

print(measurement.unit) // °C - always celsius as it was set as Celsius

formatter.unitStyle = .long

formatter.locale = Locale.current
formatter.string(from: measurement.unit) // degrees Celsius - always an original unit
formatter.string(from: measurement) // 76.1 degrees Fahrenheit - regarding locale/settings

formatter.locale = Locale.init(identifier: "it_IT")
formatter.string(from: measurement.unit) // gradi Celsius - always an original unit
formatter.string(from: measurement) // 24,5 gradi Celsius - regarding locale/settings

The system knows, what unit we have set. It will handle all the value conversion work, because the value was set as a pair of a value and a measurement unit.

For manual conversion:

measurement.converted(to: UnitTemperature.kelvin).value  // 297.65

Swift:

https://developer.apple.com/reference/foundation/measurementformatter

Objective-C:

https://developer.apple.com/reference/foundation/nsmeasurementformatter?language=objc


Feel free to correct a grammar.

Leave a Comment