gpt4 book ai didi

swift - 为什么泛型类型不通过约束进一步参与调用链中的方法重载?

转载 作者:搜寻专家 更新时间:2023-11-01 05:32:27 25 4
gpt4 key购买 nike

Swift 允许通过对传入的泛型类型施加约束来重载泛型方法。如果将它与具体类型一起使用,则传入的类型将参与此重载,并且将从该类型推断约束。

一旦泛型方法通过重载决策委托(delegate)给另一个方法,就无法再推断约束,而是利用上面已经放置在类型上的约束。

protocol Conformance {}

extension String : Conformance {}

// #1
func baseMethod<T>(_ value: T) {
let isConforming = T.self is Conformance.Type
}

// #2
func baseMethod<T>(_ value: T) where T : Conformance {
let isConforming = T.self is Conformance.Type
}

func delegatingMethod<T>(_ value: T) {
baseMethod(value)
}

func run() {
// Calls #2, isConforming = true
baseMethod(String())
// Calls #1, isConforming = true
delegatingMethod(String())
}

我假设这是存在的,这样您就可以从调用站点获得足够的类型信息,了解无论在何处使用泛型类型,哪些约束适用,但它似乎严重和人为地限制了约束重载的效用。

对于这种奇怪现象,是否有任何已知的解决方法?模仿这一点的东西将非常有用。

最佳答案

Swift allows generic methods to be overloaded by the constraints placed upon the generic types passed in.

是的...但要非常清楚这是静态重载,而不是动态覆盖。它基于可以在编译时证明的类型。

func delegatingMethod<T>(_ value: T) {
baseMethod(value)
}

我们现在正在编译它,我们需要将它作为一个具体的静态函数调用(可能是内联的)写入二进制文件。我们对 T 了解多少?我们对 T 一无所知,所以任何 where 子句都会失败。

我们甚至不知道这个函数是如何调用的,因为调用可能来自另一个编译单元或模块。虽然原则上,它可以根据访问级别具有不同的语义,例如一个版本在私有(private)时使用并且可以评估所有调用,而另一个版本在公共(public)时使用,这将是一个非常可怕的错误来源。

您要求的是 delegatingMethod 将其关于调用什么函数的决定推迟到运行时。这不是泛型的工作方式。此外,您要求将所有 where 子句编码在二进制文件中的某处,以便可以在运行时对其进行评估。也不是泛型的工作方式。这将需要一个比 Swift 想要实现的更动态的调度系统。这并非不可能;它只是一种完全不同的动物,并且阻止了许多优化。

这感觉就像您正在尝试使用协议(protocol)和泛型重新发明类继承。你不能。它们是不同的解决方案并具有不同的功能。类继承基本上是动态的。协议(protocol)和泛型基本上是静态的。如果您想要基于特定类型的动态调度,请使用类。

关于swift - 为什么泛型类型不通过约束进一步参与调用链中的方法重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54151298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com