为什么我的公斤/磅换算返回 0?

Jim*_*Jim 0 measurement swift

我的函数用于在公斤和磅之间进行转换。由于某些未知原因,该converted(to:)方法似乎要么返回 0(我认为不太可能),要么将返回的值分配给liftWeight不起作用。

func convertUnit(liftEvent: LiftEventRepresentable ) -> LiftEventRepresentable {
    let unit = liftEvent.liftWeight.unit.symbol
    switch unit {
    case "kg":
        let weight = liftEvent.liftWeight
        print("Event weight is \(weight)") // 110.0 kg
        let liftWeight = weight.converted(to: .pounds) // this is returning 0 or the assignment isn't working
        print("The new weight is \(liftWeight)") 0.0 lb
        liftEvent.updateWeightLifted(liftWeight.value)
        liftEvent.updateWeightUnit(liftEvent.liftWeight.unit.symbol)
        return liftEvent
    case "lb":

        // I'll finish this case after I get case "kg": working

    default:
        fatalError("Oops, this should not happen")
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这可能与我过去遇到的问题类似,该问题涉及尝试将 a 分配Measurement给一个可选项,但我在此方法中没有任何可选值,因此我认为我必须做其他错误。

电梯事件:

extension LiftEvent {
    @NSManaged var date: Date
    @NSManaged var repetitions: NSNumber
    @NSManaged var uid: NSNumber?
    @NSManaged var weightLifted: NSNumber
    @NSManaged var weightUnit: String
    @NSManaged var formula: Formula
    @NSManaged var lift: Lift
}
Run Code Online (Sandbox Code Playgroud)

LiftEventRepresentable 协议是:

@objc protocol LiftEventRepresentable {
    var date: Date { get }
    var formula: Formula { get }
    var repetitions: NSNumber { get set }
    var liftWeight: Measurement<UnitMass> { get }
    var maxWeight: Double { get }
    var lift: Lift { get }
    var context: NSManagedObjectContext { get }
    var userDidChangeUnits: Bool { get set }

    func updateWeightLifted(_ weight: Double)
    func updateRepetitions(_ repetitions: Int)
    func updateMaxAmount(_ maxAmount: Measurement<UnitMass>) -> ()
    func updateLiftEventFormula(_ newFormulaUuid: String) -> ()
    func updateLift(_ newLiftUuid: String) -> ()
    func updateWeightUnit(_ newUnit: String)
    func calculateOneRepMax() -> Measurement<UnitMass>
    func updateLiftEventWithFinalValues()
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么liftEvent.liftWeight转换后是 0.0 磅?

编辑 1:这是如何liftEvent.liftWeight产生的(我最初应该将其包含在我的问题中)。它是一个计算属性,我现在知道它是导致转换总是返回 0 的原因):

class LiftEvent: NSManagedObject, LiftEventRepresentable {

    var liftWeight: Measurement<UnitMass> {
        let defaultUnit = UserDefaults.weightUnit() // returns a string ("kg" or "lb")
        let unitSymbol = UnitMass.init(symbol: defaultUnit) // the wrong way
        let liftWeight = Measurement<UnitMass>(value: Double(weightLifted), unit: unitSymbol)
    return liftWeight
    }
Run Code Online (Sandbox Code Playgroud)

编辑 2:根本问题实际上是liftEvent.liftWeight 无效。

这是我现在可以使用的新代码:

var liftWeight: Measurement<UnitMass> {
    let defaultUnit = UserDefaults.weightUnit() // returns a string ("kg" or "lb")
    let unit: UnitMass
    if defaultUnit == "kg" {
        unit = UnitMass.kilograms // the right way
        } else {
        unit = UnitMass.pounds // also the right way
    }
    let liftWeight = Measurement<UnitMass>(value: Double(weightLifted), unit: unit)
    return liftWeight
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ert 7

Measurement的单位有问题。这是一个UnitMass所以它有正确的尺寸,但它的转换器丢失了。这可能是因为您使用类似UnitMass(symbol: "kg")而不是UnitMass.kilograms.

// right way
let goodUnit = UnitMass.kilograms
let goodWeight:Measurement = Measurement(value: 110.0, unit: goodUnit)
print("Good pounds: ", goodWeight.converted(to: .pounds)) // 242.508686220216 lb

// wrong way (results in 0.0 output)
let badUnit = UnitMass(symbol: "kg")
let badWeight:Measurement = Measurement(value: 110.0, unit: badUnit)
print("Bad pounds: ", badWeight.converted(to: .pounds)) // 0.0 lb
Run Code Online (Sandbox Code Playgroud)

创建一个单元UnitMass(symbol: "kg")实际上是有效的代码,所以没有错误。您可以使用此语法使用您想要的任何符号和自定义转换器创建自己的质量单位。由于某种原因,该converter:参数是可选的,因此UnitMass(symbol: "kg")只需使用符号“kg”和UnitLinearConverter系数为 0的默认值创建一个新的质量单位。

UnitMass.kilograms相反,使用为您提供了一个预定义的千克单位,​​该单位已经使用正确的符号和转换器进行了设置。很容易犯错误,尤其是因为没有错误。

我建议查看您创建的位置liftEvent.liftWeight,因为这可能是问题所在。