我想从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

10-08 12:27