【问题标题】:Why can’t UnitType be inferred in > operator?为什么不能在 > 运算符中推断 UnitType?
【发布时间】:2020-08-31 13:09:18
【问题描述】:

为什么不能在 > 运算符中推断出UnitType

import Foundation
let mass = Measurement(value: 50, unit: UnitMass.kilograms)
mass > Measurement(value: 100, unit: .kilograms)

类型“单位”没有成员“公斤”

运算符的定义暗示它应该:

static func > (Measurement<UnitType>, Measurement<UnitType>) -> Bool

【问题讨论】:

  • 你得到的错误Type ‘Unit’ has no member ‘kilograms’ 似乎与 > func 没有任何关系
  • 您的意思是说mass &gt; Measurement... 而不是weight &gt; Measurement...?如果不是,weight 是什么?
  • 如果你的意思是mass &gt; Measurement...,那么出于某种原因这可行:mass &gt; .init(value: 100, unit: .kilograms)
  • @TylerTheCompiler 我正要发布这个
  • 这是因为Measurement 可用于初始化任何单元类型.init 假定lhs 类型init(value: Double, unit: UnitMass)

标签: swift generics types measurement


【解决方案1】:

问题在于Measurement 是一个泛型类型,因此您需要在初始化新对象时指定 Unit 类型。如果您想推断类型,您需要使用 .init 初始化器,它会推断 UnitMass 类型 init(value: Double, unit: UnitMass)

mass > .init(value: 100, unit: .kilograms)

【讨论】:

  • 有趣。那为什么这里会推断出UnitType:let mass: Measurement&lt;UnitMass&gt; = Measurement(value: 50, unit: .kilograms)?编译器知道我想分配一个Measurement&lt;UnitMass&gt;,因为我在左侧指定了它。同样,编译器应该在我的问题的比较中知道这一点,因为它知道massMeasurement&lt;UnitMass&gt;
  • 我不知道类型推断在幕后是如何工作的,但你可以将它作为一个错误报告给 Apple,看看他们是怎么说的。在我看来,它应该是双向的。
  • 可能的答案是在不发表评论的情况下关闭票证;)……无论如何都可以尝试。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-07-28
  • 2015-12-02
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多