如何在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
}
}
}