如何使用Swift 3中的度量值在函数调用中使用泛型
我需要一个与Swift 3中任何测量值一起工作的函数。以下是一个例子:如何使用Swift 3中的度量值在函数调用中使用泛型,swift,generics,swift3,Swift,Generics,Swift3,我需要一个与Swift 3中任何测量值一起工作的函数。以下是一个例子: var test2 = Measurement<UnitEnergy>( value: 10.1234, unit: .calories) func printMeasurementGeneric( measurement: Measurement<Unit>) { print( measurement.value) } func printMeasurementEnergy( measu
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)
var test2=测量值(值:10.1234,单位:。卡路里)
func printMeasurementGeneric(测量:测量){
打印(测量值)
}
func printMeasurementEnergy(测量:测量){
打印(测量值)
}
printMeasurementEnergy(度量:test2)//这是有效的
printMeasurementGeneric(度量:test2)//这不起作用,并给出以下错误
游乐场执行失败:错误:测量游乐场。游乐场:136:38:错误:无法将“测量”类型的值转换为预期的参数类型“测量”
printMeasurementGeneric(测量:test2)
PrintMeasurementGeneric的函数需要什么样才能正常工作
我已经取得了一些进展,现在在Swift Playerd中有以下代码
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测试=测量值(值:10.1234,单位:。卡路里)
func printMeasurementGeneric(测量:测量){
打印(测量值)
}
//这很有效
printMeasurementGeneric(测量:测试)//这是有效的
//下面的方法不起作用
var objectValue:有吗?
objectValue=测试
var meas=objectValue as!度量//无法将“Foundation.Measurement”(0x11d324028)类型的值强制转换为“Foundation.Measurement”(0x11d324088)。
打印测量通用(测量: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!")
}
var测试=测量值(值:10.1234,单位:。卡路里)
func printMeasurementGeneric(测量:测量){
打印(测量值)
}
//这很有效
printMeasurementGeneric(测量:测试)//这是有效的
//下面的方法很管用,但并不漂亮。有更好的办法吗
var objectValue:有吗?
objectValue=测试
如果objectValue是度量值{
设meas=对象值为!测量值
打印测量通用(测量:meas)
}否则,如果objectValue是度量值{
设meas=对象值为!测量值
打印测量通用(测量:meas)
}否则,如果objectValue是度量值{
设meas=对象值为!测量值
打印测量通用(测量:meas)
}否则,如果objectValue是度量值{
设meas=对象值为!测量值
打印测量通用(测量:meas)
}否则{
打印(“未找到演员表!”)
}
将您的printmasurementgeneric
功能更改为此
func PrintMeasurementGeneric<Dimension>( measurement: Measurement<Dimension>) {
print( measurement.value)
}
func打印测量通用(测量:测量){
打印(测量值)
}
我使用了维度
类型而不是单位
。这两种方法都可以工作,但所有测量类型都符合维度
(单位的抽象子类)
Hamish(下图)是正确的。将您的
PrintMeasurementGeneric
函数更改为此
func PrintMeasurementGeneric<Dimension>( measurement: Measurement<Dimension>) {
print( measurement.value)
}
func打印测量通用(测量:测量){
打印(测量值)
}
我使用了维度
类型而不是单位
。这两种方法都可以工作,但所有测量类型都符合维度
(单位的抽象子类)
哈米什(下图)是对的。这可以通过协议来实现:
protocol HasValue {
var value: Double { get set }
}
extension Measurement: HasValue { }
func printValue<T: HasValue>(of item: T) {
print(item.value) // prints "10.1234"
}
var test = Measurement<UnitEnergy>( value: 10.1234, unit: .calories)
printValue(of: test)
协议值{
var值:Double{get set}
}
扩展度量:HasValue{}
func打印值(项目编号:T){
打印(item.value)//打印“10.1234”
}
var测试=测量值(值:10.1234,单位:。卡路里)
打印值(of:测试)
任何类似于printValue的函数都应该能够通用地使用任何度量。您可以在组织的协议扩展中包含这些功能。这可以通过协议实现:
protocol HasValue {
var value: Double { get set }
}
extension Measurement: HasValue { }
func printValue<T: HasValue>(of item: T) {
print(item.value) // prints "10.1234"
}
var test = Measurement<UnitEnergy>( value: 10.1234, unit: .calories)
printValue(of: test)
协议值{
var值:Double{get set}
}
扩展度量:HasValue{}
func打印值(项目编号:T){
打印(item.value)//打印“10.1234”
}
var测试=测量值(值:10.1234,单位:。卡路里)
打印值(of:测试)
任何类似于printValue的函数都应该能够通用地使用任何度量。您可以将这些函数包含在组织的协议扩展中。我认为这里有一点混乱–说
引入了一个新的通用占位符,称为维度,但是它与FooBar
的Dimension
类完全无关–您可以继续调用通用占位符FooBar
,这不会有什么区别。你说“Dimension
和Unit
是协议”也是错误的——它们实际上是类。强制转换不起作用的原因是泛型是不变的。我认为这里有一点混乱——说
引入了一个新的泛型占位符,名为维度,但是它与FooBar
的Dimension
类完全无关–您可以继续调用通用占位符FooBar
,这不会有什么区别。你说“Dimension
和Unit
是协议”也是错误的——它们实际上是类。cast不起作用的原因是泛型是不变的。第一步是停止以大写字母开头函数名的做法。别说了。现在。谢谢,修正了大写字母。从objectValue中获取度量值的第2步是NSControl?第一步是停止以大写字母开头函数名的做法。别说了。现在。谢谢,修正了大写字母。从objectValue中获取度量值的步骤2是NSControl吗?