为什么使用泛型的示例会在编译时得到解析?

问题描述 投票:0回答:1

考虑这个例子:

func myFunction(parameter: any myProtocol)

这个例子:

func myFunction<T: myProtocol>(parameter: T)

我在这个 video @ 2:20 中听说第一个示例的性能要差得多,因为类型是在运行时解析的,而第二个示例则不是。 YouTuber 没有提供更多关于为什么会出现这种情况的详细信息,而且我在互联网上找不到有关此特定问题的更多信息......

我的问题是:这真的是真的吗?如果是的话,那么 Swift 开发团队为什么做出这个决定呢?为什么使用泛型类型的示例在编译时得到解析,而不是另一个?这两者有何不同?他们做同样的事情,不是吗?那么为什么第一个例子不能在编译时得到解析呢?最后,如果第一个示例在编译时未解析有实际原因,我什么时候应该使用它?如果是这种情况,我想不出使用

any
会更好的例子。

swift generics any
1个回答
0
投票

使用

any
时,实际对象被“装箱”,并且使用它需要额外的努力,因为实际类型可以是符合指定协议的任何类型。因此,编译器无法确定“哦,在这种情况下,实际类型是 X,所以我将输出使用该特定类型的代码”,它必须假设它可以是任何东西。

另一种方法假设传入类型没有改变,所以如果是 X 进来,那么整个函数中都会是 X,这样编译器就可以输出特定于该类型的代码,并忽略类型在某个时刻发生变化的任何可能性。

© www.soinside.com 2019 - 2024. All rights reserved.