我在操场上写了一些示例代码,并希望函数返回两个值之间的距离,这两个值符合Swift中的Strideable协议,以便我可以使用distance(to other: Self) -> Self.Stride
功能。我的执行情况如下:通用在哪里条款歧义与相关类型在Swift
func distanceFrom<T: Strideable, U>(_ a: T, to b: T) -> U where T.Stride == U
{
return a.distance(to: b)
}
观察此功能,一段时间后,我意识到,我不知道这是在where子句中使用跨越,一个从a
或b
。根据我的理解,a
和b
将有可能为Stride
定义不同的关联类型。此外,我还没有发表任何声明来确保a.Stride == b.Stride,尽管我明白我可以扩展我的where子句来做到这一点。
那么,哪一个会习惯检查与U
等价?清楚的是,问题不在于这个特定的代码块,而在于存在这种模糊性的任何情况。
我相信a和b都符合Strideable协议,但它们可能是不同的类型。我测试过用一个Int来调用这个函数,b是一个Double,并且它按照预期编译和运行。 – tnev
请使用我添加到我的答案中的屏幕截图和代码片段再试一次。我相信他们(都是T的)必须是相同的类型。 – Underhill