如何在Swift中存储通用度量?

如何在Swift中存储通用度量?,swift,foundation,Swift,Foundation,我想有一个变量,可以代表一个单一的,但可能有不同的单位类型。例如,它可以存储长度或质量。看起来很简单,但我想不出来 以下是我尝试过的: struct Data { var weight: Measurement<UnitMass> var length: Measurement<UnitLength> var target = "Weight" var valueOfTarget: Measurement<Unit> {

我想有一个变量,可以代表一个单一的,但可能有不同的单位类型。例如,它可以存储长度或质量。看起来很简单,但我想不出来

以下是我尝试过的:

struct Data {
    var weight: Measurement<UnitMass>
    var length: Measurement<UnitLength>
    var target = "Weight"

    var valueOfTarget: Measurement<Unit> {
        if target == "Weight" {
            return weight
        } else {
            return length
        }
    }
}

var data = Data(weight: Measurement<UnitMass>(value: 10, unit: UnitMass.kilograms),
                length: Measurement<UnitLength>(value: 10, unit: UnitLength.centimeters),
                target: "Weight")

print(data.valueOfTarget)
struct数据{
变量权重:度量
变量长度:测量
var target=“重量”
目标的var值:测量{
如果目标==“重量”{
回重
}否则{
返回长度
}
}
}
var数据=数据(重量:测量值:10,单位:单位质量千克),
长度:测量值(值:10,单位:UnitLength.cm),
目标:“重量”)
打印(数据。目标值)
我还尝试使用另一个答案中建议的
,但也有类似的错误

这将导致编译器错误:

error: cannot convert return expression of type 'Measurement<UnitMass>' to return type 'Measurement<Unit>'
错误:无法将“Measurement”类型的返回表达式转换为“Measurement”类型的返回表达式

我是否遗漏了一些明显的东西,或者这是不可能的?

您可以创建新的通用返回值。这对我来说似乎没问题

struct Data {
    var weight: Measurement<UnitMass>
    var length: Measurement<UnitLength>
    var target = "Weight"

    var valueOfTarget: Measurement<Unit> {
        if target == "Weight" {
            return Measurement<Unit>(value: weight.value, unit: weight.unit)
        } else {
            return Measurement<Unit>(value: length.value, unit: length.unit)
        }
    }
}

var data = Data(weight: Measurement<UnitMass>(value: 10, unit: UnitMass.kilograms),
                length: Measurement<UnitLength>(value: 10, unit: UnitLength.centimeters),
                target: "Weight")

print(data.valueOfTarget)
struct数据{
变量权重:度量
变量长度:测量
var target=“重量”
目标的var值:测量{
如果目标==“重量”{
返回测量值(值:weight.value,单位:weight.unit)
}否则{
返回测量值(值:length.value,单位:length.unit)
}
}
}
var数据=数据(重量:测量值:10,单位:单位质量千克),
长度:测量值(值:10,单位:UnitLength.cm),
目标:“重量”)
打印(数据。目标值)

< /代码> 首先,不要将自己的结构命名为<代码>数据< /代码>,因为基金会已经有一个被称为“代码>数据< /代码>的类型,它被广泛使用。

其次,由于(在评论中)您说“这是为了减肥,用户可以选择一个目标作为体重或腰围”,因此您可能应该使用
enum
而不是
struct

enum WeightLossTarget {
    case weight(Measurement<UnitMass>)
    case waistSize(Measurement<UnitLength>)
}

您打算如何使用
目标
?这将有助于找出哪些选项适合你。什么是测量?当你在参数中键入
时,你可能不需要
。@CraigSiemens这是为了减肥,用户可以选择一个目标作为体重或腰围size@TheRock我在questionMake Target generic.Argh中添加了测量类的链接,我希望你没有玩过这张牌。我只能玩苹果给我的牌
struct WeightLossTarget {
    enum TargetType {
        case weight
        case waistSize
    }

    var weight: Measurement<UnitMass>
    var waistSize: Measurement<UnitLength>
    var target: TargetType

    var valueOfTarget: NSMeasurement {
        switch target {
        case .weight: return weight as NSMeasurement
        case .waistSize: return waistSize as NSMeasurement
        }
    }
}