gpt4 book ai didi

swift - 如何从 Swift 中的 Measurement 派生类

转载 作者:可可西里 更新时间:2023-11-01 00:58:02 27 4
gpt4 key购买 nike

我想在 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)
}
}
}

最佳答案

您想创建一个扩展。您在这里开始做的实际上是定义一个子类。 Measurement 实际上是一个 ModelType 而不是一个类 https://developer.apple.com/reference/foundation/measurement (虽然,我不是 100% 确定 Swift 中的 ModelTypes 是否只是一种类,所以这可能无关紧要)。

但要回答这个问题,实际上已经有很多内置类型可以进行转换,所以我不确定您是否需要按照您的要求进行操作。什么是英制版的厘米?是英寸还是英尺?什么是英制版的毫米?

在没有任何扩展的情况下,您可以执行以下操作:

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”。它所做的只是检查基本类型,如果是厘米,则返回英寸类型,如果是米,则使用英尺,或默认为英寸。您可以在这里根据需要为“Imperial”定义各种 UnitTypes 的自定义处理。

像这样使用它:

testInMetres.convert(to: UnitLength.imperial) // Returns length in feet.

我以前没有用过测量,这篇文章作为背景真的很有用。 https://oleb.net/blog/2016/07/measurements-and-units/

关于swift - 如何从 Swift 中的 Measurement 派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40600592/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com