如何在Swift中表示质量的大小?

bog*_*gen 3 enums swift

// SI units
enum Magnitude : Measurement {
    case Milli = Measurement(-3, "ml")
    case Centi = Measurement(-2, "cl")
    case Desi = Measurement(-1, "dl")
    case Gram = Measurement(0, "g")
    case Kilo = Measurement(3,"kg")
}


class Measurement {

    let magnitude : Int
    let shorthandName : String

    init(magnitude: Int, shorthandName: String) {
        self.magnitude = magnitude
        self.shorthandName = shorthandName
    }

}
Run Code Online (Sandbox Code Playgroud)

我正在将转换器作为应用程序的一部分来实现.我开始在不同质量的大小之间进行转换.我认为将Magnitude作为枚举很好,与其简短的名字紧密相关.但是Swift并没有让我有一个包含对象的枚举,因为原始值需要是一个字面值.任何人都知道一种更聪明的方式来表示幅度,速记名称和单位之间的转换之间的联系吗?

Pri*_*ngo 6

根据您的需要,您可以组合SI单位比例的枚举和Apple Swift编程指南的计算属性部分中的示例.在这种简单的方案中,所有输入测量值都将存储在相同的单位中(本例中为克).然后,您将转换为输出中所需的任何单位.

它非常易读.

enum SI {
    case kg
    case hg
    case dag
    case g
    case dg
    case cg
    case mg

    var scale: Double {
        switch self {
        case kg:  return    0.001
        case hg:  return    0.01
        case dag: return    0.1
        case g:   return    1.0
        case dg:  return   10.0
        case cg:  return  100.0
        case mg:  return 1000.0
        }
    }
}

extension Double {
    var kg:  Double {return self * 1000.0}
    var hg:  Double {return self *  100.0}
    var dag: Double {return self *   10.0}
    var g:   Double {return self}
    var dg:  Double {return self *    0.1}
    var cg:  Double {return self *    0.01}
    var mg:  Double {return self *    0.001}

    func convertTo(si: SI) ->  Double {return self * si.scale}
}
Run Code Online (Sandbox Code Playgroud)

例:

在此输入图像描述