// 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并没有让我有一个包含对象的枚举,因为原始值需要是一个字面值.任何人都知道一种更聪明的方式来表示幅度,速记名称和单位之间的转换之间的联系吗?
根据您的需要,您可以组合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)
例:
