【发布时间】:2017-05-09 10:16:06
【问题描述】:
我正在使用 Swift 3 开发 iOS 应用程序,我需要从设置应用程序(摄氏度或华氏度)获取用户首选的温度单位。我试图为它找到一个解决方案,但没有成功。 :( 任何人都可以建议如何做到这一点。
提前致谢!
【问题讨论】:
-
我为它写了一个扩展,在这里查看stackoverflow.com/a/65647650/1290278
我正在使用 Swift 3 开发 iOS 应用程序,我需要从设置应用程序(摄氏度或华氏度)获取用户首选的温度单位。我试图为它找到一个解决方案,但没有成功。 :( 任何人都可以建议如何做到这一点。
提前致谢!
【问题讨论】:
这可以通过 swift 中的 MeasurementFormatter 来完成。
此方法不使用任何私有 API。请记住在实际设备(iOS 10+)上运行它,因为模拟器没有该选项。
let formatter = MeasurementFormatter.init()
let temperature = Measurement.init(value: 37.0, unit: UnitTemperature.celsius)
let localTemperature = formatter.string(from: temperature)
if(localTemperature.contains("C")) {
print("UNIT IS °C")
} else {
print("UNIT IS °F")
}
【讨论】:
kCFLocaleTemperatureUnitKey 密钥未记录在案。所以苹果可能对此有问题。请阅读this thread 了解更多信息。他的应用因为这个键而被拒绝。
let locale = NSLocale.current as NSLocale
let obj = locale.object(forKey: NSLocale.Key(rawValue: "kCFLocaleTemperatureUnitKey"))
print("\(obj!)")
【讨论】:
【讨论】:
我已经修改了其他答案以获得更优雅的选择
extension Locale {
var temperatureUnit: UnitTemperature {
let units: [UnitTemperature] = [.celsius, .fahrenheit, .kelvin]
let measurement = Measurement(value: 37, unit: UnitTemperature.celsius)
let temperatureString = MeasurementFormatter().string(from: measurement)
let matchedUnit = units.first { temperatureString.contains($0.symbol) }
if matchedUnit != nil {
return matchedUnit!
}
return usesMetricSystem ? .celsius : .fahrenheit
}
}
【讨论】: