【发布时间】:2016-11-27 20:08:36
【问题描述】:
我需要一个可以处理 Swift 3 中任何测量值的函数。下面是一个示例:
var test2 = Measurement<UnitEnergy>( value: 10.1234, unit: .calories)
func printMeasurementGeneric( measurement: Measurement<Unit>) {
print( measurement.value)
}
func printMeasurementEnergy( measurement: Measurement<UnitEnergy>) {
print( measurement.value)
}
printMeasurementEnergy(measurement: test2) // This works
printMeasurementGeneric(measurement: test2) // This doesn't work and give the following error
Playground execution failed: error: Measurement Playground.playground:136:38: error: cannot convert value of type 'Measurement<UnitEnergy>' to expected argument type 'Measurement<Unit>'
printMeasurementGeneric(measurement: test2)
PrintMeasurementGeneric 需要什么样的函数才能正常工作?
我已经取得了一些进展,现在在 Swift Playground 中有以下代码
var test = Measurement<UnitEnergy>( value: 10.1234, unit: .calories)
func printMeasurementGeneric<A:Dimension>( measurement: Measurement<A>) {
print( measurement.value)
}
// This works
printMeasurementGeneric(measurement: test) // This works
// The following doesn't work
var objectValue: Any?
objectValue = test
var meas = objectValue as! Measurement<Dimension> // Could not cast value of type 'Foundation.Measurement<NSUnitEnergy>' (0x11d324028) to 'Foundation.Measurement<NSDimension>' (0x11d324088).
printMeasurementGeneric(measurement: meas)
我正在尝试使用 NSControl 中的 objectValue 来保存测量值。在检查是否可以将其转换为每种测量类型时如何执行此操作?
还有一些工作,包括下面的编辑。不是一个漂亮或强大的解决方案。
var test = Measurement<UnitEnergy>( value: 10.1234, unit: .calories)
func printMeasurementGeneric<A>( measurement: Measurement<A>) {
print( measurement.value)
}
// This works
printMeasurementGeneric(measurement: test) // This works
// The following works but isn't pretty. Is there a better way
var objectValue: Any?
objectValue = test
if objectValue is Measurement<UnitFrequency> {
let meas = objectValue as! Measurement<UnitFrequency>
printMeasurementGeneric(measurement: meas)
} else if objectValue is Measurement<UnitLength> {
let meas = objectValue as! Measurement<UnitLength>
printMeasurementGeneric(measurement: meas)
} else if objectValue is Measurement<UnitSpeed> {
let meas = objectValue as! Measurement<UnitSpeed>
printMeasurementGeneric(measurement: meas)
} else if objectValue is Measurement<UnitEnergy> {
let meas = objectValue as! Measurement<UnitEnergy>
printMeasurementGeneric(measurement: meas)
} else {
print("Didn't find cast!")
}
【问题讨论】:
-
第一步是停止这种以大写字母开头的函数名的做法。停下来吧。现在。谢谢。
-
修正了大写。从 objectValue 中获取测量值的第 2 步是 NSControl?