在 Swift 内将开尔文转换为摄氏度

Convert Kelvin into Celsius in Swift

我正在尝试从用户当前位置检索温度。

我正在使用来自 OpenWeatherMap 的 API。问题是,他们默认提供开尔文温度,而我想要摄氏温度。

我知道我只需要从开尔文值中减去 273.15...?但我正在努力弄清楚在哪里做。

我设置标签的代码:

var jsonData: AnyObject?

func setLabels(weatherData: NSData) {

    do {

        self.jsonData = try NSJSONSerialization.JSONObjectWithData(weatherData, options: []) as! NSDictionary

    } catch {
        //handle error here

    }

    if let name = jsonData!["name"] as? String {

        locationLabel.text = "using your current location, \(name)"

    }

    if let main = jsonData!["main"] as? NSDictionary {
        if let temperature = main["temp"] as? Double {

            self.tempLabel.text = String(format: "%.0f", temperature)

        }

    }

}

谁能帮我解决这个问题,因为我真的不知道从哪里开始,谢谢。

如果您需要查看我的更多代码,请告诉我。

if let kelvinTemp = main["temp"] as? Double {
    let celsiusTemp = kelvinTemp - 273.15
    self.tempLabel.text = String(format: "%.0f", celsiusTemp)
}

或干脆

self.tempLabel.text = String(format: "%.0f", temperature - 273.15)

从上面的代码来看,在我看来,正确的位置是在你获得温度之后

if let temperatureInKelvin = main["temp"] as? Double {
  let temperatureInCelsius = temperatureInKelvin - 273.15
  self.tempLabel.text = String(format: "%.0f", temperature)
}

但在未来,我可能会在单独的 class 中解析您的 JSON 值,并将它们存储在您稍后可以调用的模型对象中。

这里:

self.tempLabel.text = String(format: "%.0f", temperature - 273.15)

或者你可以在这里做(伪语法,因为我不太了解Swift):

if let temperature = (main["temp"] as? Double) - 273.15 {
    self.tempLabel.text = String(format: "%.0f", temperature)
}

对于Swift4.2:

使用测量格式器。

let mf = MeasurementFormatter()

此方法将一种温度类型(开尔文、摄氏度、华氏度)转换为另一种:

  func convertTemp(temp: Double, from inputTempType: UnitTemperature, to outputTempType: UnitTemperature) -> String {
    mf.numberFormatter.maximumFractionDigits = 0
    mf.unitOptions = .providedUnit
    let input = Measurement(value: temp, unit: inputTempType)
    let output = input.converted(to: outputTempType)
    return mf.string(from: output)
  } 

用法:

let temperature = 291.0
let celsius = convertTemp(temp: temperature, from: .kelvin, to: .celsius) // 18°C 
let fahrenheit = convertTemp(temp: temperature, from: .kelvin, to: .fahrenheit) // 64°F

要输出本地化温度格式,删除行 mf.unitOptions = .providedUnit

上述便捷函数的一个更简单的示例(针对 Swift 5.3 进行了更新)类似于:

func convertTemperature(temp: Double, from inputTempType: UnitTemperature, to outputTempType: UnitTemperature) -> Double {
    let input = Measurement(value: temp, unit: inputTempType)
    let output = input.converted(to: outputTempType)
    return output.value
}