我想从Measurement类派生Swift 3中的类,以便添加其他功能来为每个度量定义“英制”和“公制”默认单位。我该怎么做?下面是我的开始。
enum UnitOptions { case imperial, metric }
class CustomMeasurement : Measurement {
let imperialUnit: Unit
let metricUnit: Unit
let inputMeasurement = Measurement<Unit>
init( value: Double, inputUnit: Unit, imperialUnit: Unit, metricUnit: Unit) {
self.imperialUnit = imperialUnit
self.metricUnit = metricUnit
inputMeasurement = Measurement<Unit>( value: value, unit: inputUnit)
}
func getMeasurement( unitSystem: UnitOptions) {
if (unitSystem == .imperial) {
return inputMeasurement.converted(to: imperialUnit)
} else {
return inputMeasurement.converted(to: metricUnit)
}
}
}
最佳答案
要创建扩展名。您在这里开始做的实际上是定义一个子类。度量实际上是一个模型类型,而不是一个类(尽管,我不能100%确定在Swift模型类型中是否只是一个类的类型,所以这可能无关紧要)。
但要回答这个问题,实际上已经有很多内置类型可以进行转换,所以我不确定您是否需要严格按照您的要求进行转换。什么是厘米的帝国版本?是英寸还是英尺?什么是英制毫米?
如果没有任何扩展,您可以执行以下操作:
let testInch : Measurement = Measurement(value: 25, unit: UnitLength.inches)
let testCM : Measurement = Measurement(value: 10, unit: UnitLength.centimeters)
var testInMetres = (testInch + testCM).converted(to: UnitLength.meters)
把事物定义为一个度量,用一个单位,然后你可以不加任何惩罚地加、减等,然后你就可以随意使用它们了。
如果你想要“帝国”式的,我会这样做:
extension UnitLength {
static var imperial: UnitLength {
switch self.baseUnit() {
case centimeters:
return UnitLength.inches
case meters:
return UnitLength.feet
default:
return UnitLength.inches
}
}
}
我们扩展了UnitLength类型以包括一个新类型“Imperial”。它所做的就是检查基本类型,如果是厘米,返回类型为英寸,如果是米,使用英尺,或者默认为英寸。您可以在这里根据自己的喜好为“帝国”定义各种单位类型的自定义处理。
这样使用:
testInMetres.convert(to: UnitLength.imperial) // Returns length in feet.
我以前没有用过测量,这篇文章作为背景非常有用。https://developer.apple.com/reference/foundation/measurement