swift - 如何在使用 Swift 3 中的 Measurements 的函数调用中使用泛型

标签 swift generics swift3

我需要一个函数来处理 Swift 3 中任何 Measurement 中的值。下面是一个示例:

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!")
}

最佳答案

将您的 PrintMeasurementGeneric 函数更改为此。

func PrintMeasurementGeneric<Dimension>( measurement: Measurement<Dimension>) {
  print( measurement.value)
}

我使用了 Dimension 类型而不是 Unit。两者都应该有效,但所有测量类型都符合 Dimension(Unit 的抽象子类)。

Hamish(下)是对的。

关于swift - 如何在使用 Swift 3 中的 Measurements 的函数调用中使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40833364/

相关文章:

ios - 如何在 Swift 3 中表达空 URL?

ios - 当应用程序进入后台时,应用程序中的 FaceID 或 touchID 是否会停止在后台播放音频?

c# - 如何在具有多个约束的 C# 中实现泛型方法

ios - 无法实现 JSQMessagesViewController Swift 3 所需的方法

java - 有支持泛型的 xdoclet 替代品吗?

java - 基于类字段的转换函数返回类型

swift - DispatchSourceTimer 和 Swift 3.0

ios - UITextField 在模拟器中更大

swift - 订阅以获取嵌套数组

ios - swift ios 无法从堆栈中删除旧模型 viewcontroller