首页 > 解决方案 > 我对 Swift 中的值类型 () 感到困惑。它是什么,我打算如何使用它?

问题描述

我正在尝试将带有小数的英尺高度转换为英尺和英寸的高度。

我正在尝试使用 .round(.down) 方法来获取英尺,并将小数点乘以 12 得到英寸。我遇到了各种各样的错误,比如:

var heightInFeet: Float = 5.45
let feetRounded = heightInFeet.round(.down) // feetRounded is "type ()." What is that?
percentToNextFoot = heightInFeet - feetRounded // Error: Binary operator '-' cannot be  applied to operands of type 'Float' and '()'

我尝试了以下方法并得到了另一个错误:

percentToNextFoot = heightInFeet - Float(feetRounded) // Cannot invoke initializer for type 'Float' with an argument list of type '(())'

我终于通过避免使用 .round() 方法让它工作了,但我仍然对值类型 () 感到困惑。谁能解释这里发生了什么?:

var heightInFeet: Float = 5.45
var feet = Int(heightInFeet) // 5
var percentToNextFoot = heightInFeet - Float(feet) // 0.45
let heightInFeetAndInches = "\(feet)ft \(Int(percentToNextFoot * 12))in" // 5ft 5in

标签: swiftvalue-type

解决方案


欢迎来到堆栈溢出!

Double有两种舍入方法:

  1. Double.round(),它Double通过就地变异来舍入一个值。这是你打电话的。它不返回任何东西,严格来说意味着它返回Voidaka()空元组。
  2. Double.rounded(),它Double通过返回一个新的值来舍入一个值Double。这是您可能打算调用的那个。

通过调用第一个,并尝试将值分配给一个变量,您最终会得到一个类型为 的变量Void,其值为()

这是一个常见的 Swift 约定:“object.foo”在原地编辑它。“object.fooed”返回一个变异的副本。

也就是说,在您的情况下,我建议使用现有MeasurementAPI 执行此操作:


import Foundation

extension Measurement where UnitType == UnitLength {
    func toFeetAndInches() -> (feet: Measurement<UnitLength>, inches: Measurement<UnitLength>) {
        let numberOfWholeFeet = self.converted(to: .feet).value.rounded(.towardZero)

        return (
            feet: Measurement(value: numberOfWholeFeet, unit: UnitLength.feet),
            inches: Measurement(value: self.value - numberOfWholeFeet, unit: UnitLength.feet).converted(to: .inches)
        )
    }
}


let heightInFeet = Measurement(value: 5.5, unit: UnitLength.feet)
let (feet, inches) = heightInFeet.toFeetAndInches()

let mf = MeasurementFormatter()
mf.unitOptions = .providedUnit // force the use of feet/inches, rather than the unit appropriate for the user's locale.
mf.unitStyle = .medium
print(mf.string(for: feet)!, mf.string(for: inches)!) // => "5 ft. 6 in."

推荐阅读