Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Swift 3中的度量值在函数调用中使用泛型_Swift_Generics_Swift3 - Fatal编程技术网

如何使用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

我需要一个与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)
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吗?