で測定値を使用して、関数呼び出しでジェネリックを使用しないことの例です:どのように私は以下スウィフト3のいずれかの測定の値で動作する機能を必要としスウィフト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のように見えますか?
私はいくつかの進歩を遂げ、今、私は測定を保持するために、NSControlでobjectValueを使用しようとしている
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)
スウィフトの遊び場に次のコードを持っていました。すべての測定タイプにキャストできるかどうかをチェックするにはどうすればよいですか?
さらにいくつかの作業があり、以下の編集が含まれます。かなりか堅牢なソリューションではありません。
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!")
}
ステップ1は、大文字で関数名を始めるこの習慣を停止することです。ただそれをやめてください。今。ありがとう。 – matt
大文字を修正しました。 objectValueから測定値を取得するステップ2はNSControlですか? – Andrew